【问题标题】:Queue implementation of file monitoring and send them to a web service文件监控的队列实现并将它们发送到 Web 服务
【发布时间】:2013-02-04 18:50:34
【问题描述】:

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

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

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

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

感谢您的回答, 天狐

【问题讨论】:

    标签: c# multithreading thread-safety queue implementation


    【解决方案1】:

    开头:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 感谢彼得的回答。我的问题从将文件一个一个地传输到 Web 服务开始。这就是为什么我想排队,把它们堆起来(传输很慢)。但这里有一个问题:我可能已经有几个文件排队,更多来自文件观察器,有些在上传后从队列中删除。我应该如何管理这个逻辑?
      猜你喜欢
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多