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 回答