私は約1GBのメモリを使用する広範な画像計算タスクを持っています(計算サイクルは約4秒かかります)。 FileSystemWatcherを使用してフォルダに到着すると、それらのイメージを自動的に処理します。 FileSystemWatcherは、私はEventHandlerの方法で作業をキューに新しいファイルのためのイベントを起動したとき:c#FileSystemWatcherのメモリ制限のためにコアよりもスレッド数が少ないThreadPool
private void OnNewFileInDir(object source, FileSystemEventArgs evtArgs)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(ProcessTheNewImage), evtArgs.FullPath);
}
私の問題は、ファイルがすぐに到着したときに、プログラムが定期的にクラッシュするということです。デバッグウィンドウでは、近いうちに3GBのメモリが使用されていることがわかります。より少ないメモリを使用するために小さい画像を使用すると、クラッシュはありません(これまでのところ)。
私の質問:私のコンピュータのコアと独立した少ないスレッド(おそらく2つ)を使用するにはどうすればよいですか?
FileSystemWatcherを使用してスレッドプールに新しいファイルをキューイングする方法は私のアプローチですか?私はスレッドレースやそれに類するものは経験していません。 それで、さらに:それはスレッドセーフだと思いますか?ここでは完全を期すためにたくさん先行し、すべての最高の
ティム
おかげで、スレッド(読みやすくするために簡略化ビット)によって実行されるコードです:
private void ProcessTheNewImage(object threadFilenameInfo)
{
String filename = (String)threadFilenameInfo;
// Load the image
Image currentImage = Image.FromFile(filename);
//Calculate the image in an external DLL
Image currentResultImage = ImageProcessing.getResultImage(currentImage);
//Create the filename with the result infos
string saveFileName = "blahblah";
//Save the image
currentResultImage.Save(saveFileName);
//dispose the images
currentImage.Dispose();
currentResultImage.Dispose();
}
どのようにクラッシュしますか? OutOfMemoryExceptionが発生していますか?もしそうなら、それを64ビットとしてコンパイルすることができます。 –
ねえ、ごめんなさい、申し訳ありません:それは例外なくクラッシュしました。ちょうどこの小さなウィンドウが開きます... "プログラムxzyはもう動作しません"または英語で何を言いますか(ドイツ語: "xyz funktioniert nicht mehr") – CaptIglu
あなたが記述している状況は、未処理の例外のようです。あなたが 'ProcessTheNewImage()'にtry/catchを置くと、どのプロセスが表示されるでしょうか。 –