【问题标题】:Files processed more than once while using File System Watcher使用 File System Watcher 时多次处理的文件
【发布时间】:2016-01-20 17:55:51
【问题描述】:

我正在使用文件系统监视器来监视目录并在创建新文件时处理文件。我使用带有后台工作程序的计时器来防止并发问题和内存溢出。

这就是我所拥有的

 //creating the watcher 

            watcher = new FileSystemWatcher();
            watcher.Path = @"C:\Users\me\Desktop\watch";
             watcher.Filter = "*.*";
            watcher.Created += new FileSystemEventHandler(copied);
            watcher.EnableRaisingEvents = true;



//hooking to creation event

 void copied(object sender, FileSystemEventArgs e)
        {
            if (bwork.IsBusy == false)
            {
                bworkprocesslist.Add(e.FullPath);

            }
            else
            {
                bworkpendinglist.Add(e.FullPath);

            }


          }

  //used timer to prevent concurrent access of resources and memory overflow

 private void timer1_Tick(object sender, EventArgs e)
        {
            if (bwork.IsBusy==false)
            {
                bwork.RunWorkerAsync();
            }

        }


// Maintaining Lists and removed processed file from the main list 

 private void bwork_DoWork(object sender, DoWorkEventArgs e)
        {
            List<string> removedfiles = new List<string>();
            foreach (string pfile in bworkprocesslist)
            {
            process(pfile) //Do processing of pfile
            removedfiles.Add(pfile);
            }
       foreach (string x in removedfiles)
        {

            bworkprocesslist.Remove(x);
        }


        }

//Add files from pending list after background worker completion



 void bwork_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            foreach (string s in bworkpendinglist)
            {
                bworkprocesslist.Add(s);
                bworkpendinglist.Remove(s);
            }
        }

代码运行没有任何问题。但它有时会多次处理一个文件。我不知道错误发生在哪里。

【问题讨论】:

    标签: c# .net timer concurrency filesystemwatcher


    【解决方案1】:

    这里似乎没有错误。

    来自MSDN article

    常见的文件系统操作可能会引发多个事件。为了 例如,当一个文件从一个目录移动到另一个目录时,几个 可能会引发 OnChanged 和一些 OnCreated 和 OnDeleted 事件。 移动文件是一项复杂的操作,由多个简单的 操作,因此引发多个事件。

    【讨论】:

    • 那么你建议在我的程序中丢弃这个功能吗?
    • 这取决于你的程序。 :) 如果监测苍蝇是核心功能——那么显然你不能把它扔掉。但是由于可以为单个文件多次引发此事件 - 您必须以某种方式处理它。可能您必须检查此文件是否已添加到处理列表中,或者检查它是否已处理或类似的东西。在您的应用程序环境之外很难提出更多建议。
    • 它不是核心功能,而是它的功能之一。即使文件被处理两次也不会造成任何伤害,因为它会被替换。但是为了防止浪费资源和 CPU 周期,我会检查如果该文件已被添加到列表中:)
    • 请看下面的答案。我已经做了那个人建议的改变,但没有用。希望他是对的
    【解决方案2】:

    似乎在 bwork_RunWorkerCompleted 中,您正在从 bworkpendinglist 中获取条目并将它们添加到您的 bworkprocesslist 中,但我的代码中没有可以看到您正在从 bworkpendinglist 中删除。

    即将它们添加到 bworkprocesslist 后,您应该将它们从 bworkpendinglist 中删除。

    【讨论】:

    • 请查看更新。已添加 bworkpendinglist.Remove(s);
    • 这能解决您遇到的问题吗?
    • 没有同样的问题了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多