2

我需要编写一个应用程序来监视由第三方软件创建的新文件的特定文件夹,然后将它们复制到我的存储库并一个接一个地发送到 Web 服务。文件发送后,将从 repo 中删除。

我显然会使用 FileSystemWatcher 进行文件监控并将它们复制到我的仓库中。然后我会将复制的文件名排队到队列中。

我应该从这里做什么?发送文件时如何管理此队列和出列?另一个问题是如何使这个线程安全,因为队列是从不同的线程(FileSystemWatcher)访问的?

实现这一点的最佳和最安全的方法是什么?

谢谢你的回答,SkyFox

4

2 回答 2

3

在一开始的时候:

BlockingCollection<string> q = new BlockingCollection<string>();
var bg = new BackgroundWorker();
bg.DoWork += (s,e) => SendFilesToServer();
bg.RunWorkerAsync();

在文件观察事件(文件创建)中:

q.Add(fileName);

工人':

void SendFilesToServer()
{
    string filename;
    try
    {
        while(true)
        {
            while (q.TryTake(out fileName))
            {
                // Send to the webservice
            }
            while(q.IsEmpty)
                Thread.Sleep(100);
        }
    }
    catch (InvalidOperationException)
    {
    }
}
于 2013-02-05T01:37:38.097 回答
0

我认为您不需要多个文件观察者的多个线程。(也许我误解了你的说法。)另外,我不确定你为什么需要排队。

让您的应用程序主线程运行文件观察程序。当文件观察事件被触发时,您可以启动工作线程来处理每个文件操作以完成所涉及的实际工作(每个文件一个线程)。线程操作彼此独立,因此您无需担心线程安全。观察者应该处理文件系统通知事件的隔离,这样您就不会在同一个文件中遇到两个通知事件。

于 2013-02-04T19:36:59.797 回答