У меня есть обширная задача вычисления изображения, в которой используется около 1 ГБ памяти (один цикл вычислений занимает около 4 секунд). Я обрабатываю эти изображения автоматически, когда они поступают в папку с помощью FileSystemWatcher. Когда FileSystemWatcher запускает событие для нового файла я в очереди на работу в методе EventHandler с:C# ThreadPool, используя меньше потоков, чем ядра из-за ограничений памяти с FileSystemWatcher
private void OnNewFileInDir(object source, FileSystemEventArgs evtArgs)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(ProcessTheNewImage), evtArgs.FullPath);
}
Моя проблема заключается в том, что программа падает на регулярной основе, когда файлы прибывают быстро. В окне отладки я вижу, что в этот момент используется около 3 ГБ памяти. Когда я использую меньшие изображения, чтобы использовать меньше памяти, никаких сбоев пока нет.
Вопрос: Что я могу сделать, чтобы использовать меньше (возможно только 2) потоков независимо от ядер моего компьютера?
Или мой подход использования FileSystemWatcher для создания новых файлов в пул потоков, абсолютно глупый? Я ничуть не испытываю ничьей или подобными вещами. Итак, более того: это выглядит поточно?
Большое спасибо заранее и все лучшее
Tim
Для полноты здесь код выполняется нитями (немного упрощена для удобства чтения):
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
Ситуация, которую вы описываете, выглядит как необработанное исключение. Если вы поместите try/catch в 'ProcessTheNewImage()', он покажет вам, какой из них. –