Я разрабатываю программу на C #, которая использует FilesystemWatcher для отслеживания файлов PDF, которые добавляются в monitor_directory. Каждый раз, когда файл добавляется в каталог, я добавляю его в BlockingQueue, который постоянно появляется в другом потоке бесконечного цикла while, он ждет там, пока будут добавлены пути к файлам, после чего я продолжаю обработку файлов, последнюю часть обработка файла PDF перемещает его в выходной каталог.
Поток отправки:
private static void ThreadProc(object param)
{
FileMonitorManager _this = (FileMonitorManager)param;
FileProcessingManager processingManager = new FileProcessingManager();
processingManager.RegisterProcessor(new ExcelFileProcessor());
processingManager.RegisterProcessor(new PdfFileProcessor());
while (true)
{
try
{
var path = (string)_this.FileQueue.Dequeue();
if (path == null)
break;
bool b = processingManager.Process(path);
if (!b)
{
_this.FileQueue.Enqueue(path);
Console.WriteLine("\n\nError on file: " + path);
}
else
Console.WriteLine("\n\nSucces on file: " + path);
}
catch (System.Exception e)
{
Console.WriteLine(e.Message);
}
}
}
Функция «Обработка» проверяет, существует ли файл, выполняет некоторую обработку и перемещает файл PDF в выходной каталог.
Я столкнулся с двумя проблемами: 1. Обработчик событий On_Create из FileSystemWatcher запускается ДВАЖДЫ, поэтому BlockingQueue имеет одну и ту же запись дважды, в этом случае в процедуре обработки я проверяю, не был ли файл перемещен в выходной каталог (потому что то есть заключительная часть обработки заключается в перемещении файла туда), если это так, я продолжаю обработку, если нет, я выхожу. 2. Если по какой-то причине я получаю сообщение об ошибке при доступе к содержимому файла, говорящее: файл используется другим процессом, я возвращаю FALSE из функции Process и снова добавляю путь к файлу в очередь.
Теперь ... Это работает, но работает медленно ... Как я могу сделать это в многопоточном режиме, учитывая 2 проблемы, с которыми я столкнулся ... Изменить: Что, если я получу событие , добавьте его в очередь, он появляется, очередь пуста, а затем я снова получаю то же событие, очередь пуста, поэтому он добавляется, и в основном я получаю то же событие, обработанное ДВАЖДЫ?