对文件监控的实现进行排队,并将其发送到web服务

本文关键字:服务 web 监控 文件 实现 排队 | 更新日期: 2023-09-27 17:57:51

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

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

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

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

谢谢你的回答,SkyFox

对文件监控的实现进行排队,并将其发送到web服务

开头:

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)
    {
    }
}

我认为您不需要为多个文件观察程序提供多个线程。(也许我误解了你的说法。)此外,我不知道你为什么需要排队。

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