大量のファイル ウォッチャー イベントを処理するために、ファイル ウォッチャーに以下のコードを実装しました。
監視対象の場所にフォルダーをコピーしました フォルダーには約 40K のファイルとフォルダーが含まれています。問題は、キュー アイテムがすぐに処理されないことです。一定期間に発生する処理。つまり、フォルダのコピーには約 40 分かかりました。ただし、ファイルのコピーを開始してから処理キューに約 4 ~ 5 時間かかりました
フォルダーをコピーした直後にイベントが処理されることを期待しています。
ここに私の FileProcessor クラスがあります:
class FileProcessor
{
private Queue<string> workQueue;
private Thread workerThread;
private EventWaitHandle waitHandle;
public FileProcessor()
{
workQueue = new Queue<string>();
waitHandle = new AutoResetEvent(true);
}
public void QueueInput(string filepath)
{
workQueue.Enqueue(filepath);
// Initialize and start thread when first file is added
if (workerThread == null)
{
workerThread = new Thread(new ThreadStart(Work));
workerThread.Start();
}
// If thread is waiting then start it
else if (workerThread.ThreadState == ThreadState.WaitSleepJoin)
{
waitHandle.Set();
}
}
private void Work()
{
while (true)
{
string filepath = RetrieveFile();
if (filepath != null)
ProcessFile(filepath);
else
waitHandle.WaitOne();
}
}
private string RetrieveFile()
{
if (workQueue.Count > 0)
return workQueue.Dequeue();
else
return null;
}
private void ProcessFile(string filepath)
{
// Some processing done on the file
}
}
FileSystemWatcher.Created イベントが発生するたびに使用されます。
FileProcessor fileprocessor = new FileProcessor()
void onCreated(object source, FileSystemEventArgs e)
{
try
{
fileprocessor.QueueInput(e.FullPath);
}
catch (Exception ex)
{
}
}