1

大量のファイル ウォッチャー イベントを処理するために、ファイル ウォッチャーに以下のコードを実装しました。

監視対象の場所にフォルダーをコピーしました フォルダーには約 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)
    {

    }
}
4

1 に答える 1

0

関数を処理する単一のスレッドがまだあるのでWork、ボトルネックはおそらくそこにあります。そのスレッドはProcessFile、キューを通過できる速度でのみ処理できます。ProcessFile完了するまでに時間がかかる場合は、間違いなくボトルネックが発生します。

あなたの場合、それProcessFileは単にイベントを別のアプリケーションに送信しているとおっしゃいました。そのアプリケーションがこれらのイベントをどのように処理しているかを確認する必要があります。戻る前に、これらのイベントのすべての処理を実行していると思います。

他のアプリケーションが受信したイベントをキューに入れて、呼び出し元にすばやく戻ることができるようにすることを検討することをお勧めします。それとは別に、マルチスレッド方式でこれらのイベントを処理するようにするか、これらのイベントの処理方法の効率を最大化する方法を見つける必要があります。そうでない場合は、ボトルネックを新しいキューにシフトするだけです。

于 2012-06-19T18:45:20.757 に答える