FilesystemWatcher を使用して、monitor_directory に追加された PDF ファイルを監視する ac# プログラムを開発しています。ファイルがディレクトリに追加されるたびに、別のスレッドの無限 while ループで継続的にポップされる BlockingQueue にファイルを追加し、そこでファイル パスが追加されるのを待ちます。その後、ファイルの処理を続けます。 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);
            }
        }
    }
Process 関数は、ファイルが存在するかどうかをテストし、何らかの処理を行い、PDF ファイルを出力ディレクトリに移動します。
私は 2 つの問題に直面しました。つまり、処理の最後の部分は、そこにファイルを移動することです)、移動する場合は処理を続行し、移動しない場合は終了します。2. 何らかの理由でファイルのコンテンツへのアクセス中にエラーが発生した場合: ファイルは別のプロセスによって使用されています。Process 関数から FALSE を返し、ファイル パスをキューに再度追加します。
今..これは機能しますが、動作が少し遅くなります..私が直面している2つの問題を考慮して、これをマルチスレッドで行うにはどうすればよいですか.. 編集: イベントを取得したら、キューに追加します。ポップされ、キューが空になり、同じイベントが再び発生し、キューが空であるため追加され、基本的に同じイベントが2回処理されますか?