【问题标题】:Waiting for FileSystemWatcher event to fire before completing a thread在完成线程之前等待 FileSystemWatcher 事件触发
【发布时间】:2010-11-07 00:44:27
【问题描述】:

这有点令人费解,但我会尽量解释清楚。

我正在使用带有通知过滤器的 FileSystemWatcher

toFileWatcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.FileName;

我有一个 .Created 方法和一个 .Changed 方法。

当 .Created 事件触发时,它会使用观察者提供的文件名进行一些初步检查,检查文件是否已被看到,获取目标文件夹,并返回验证信息。

我遇到了一个问题,即验证位于 .Created 方法的末尾,它会访问文件以进行一些验证,然后再将其复制到目标位置。当我到达这一点时,如果文件很大并且仍在从其源复制的过程中,它会返回一个 io“文件已在使用中”错误。

我想要做的是完成所有初步代码,然后我希望线程“挂起”,直到文件的 .Changed 方法触发,表明文件已完成,因为我只捕获对最后访问过滤器。

【问题讨论】:

    标签: c# multithreading filesystemwatcher


    【解决方案1】:

    使用可以使用ManualResetEvent。 Created 方法可以完成它的工作,然后等待 Changed 事件发出 Created 方法可以继续的信号。

    【讨论】:

      【解决方案2】:

      我将使用生产者-消费者模式设置一个单独的线程,以监视项目是否出现在队列中。这些项目将代表文件更改,并包括文件路径和发生的更改类型等信息。您的FileSystemWatcher 事件处理程序只会将项目发布到队列中,并让消费者线程出列并处理信息。这将使您需要的处理与文件系统通知事件分离,从而更容易避免“文件正在使用”问题。

      【讨论】:

      • +1,同意。但是皱纹:这不是典型的生产者-消费者模式。操作成功后才能消费。
      【解决方案3】:

      这个问题是正常的,当其他进程忙于写入文件时,您通常无法打开文件。您需要等待,您无法预测何时完成。将文件的路径添加到列表中,并使用计时器清空该列表,定期重试操作。请注意逻辑,您正在使用线程,因此您需要使用锁来保护列表。

      【讨论】:

      • 我确实考虑过一个涉及计时器的模型,但老实说,我宁愿不使用计时器或任何类型的循环。我知道它们很有效,但我正试图将我的编程风格推向事件驱动调用。
      • 好吧,如果您对写入文件的过程有足够的了解,那么您可能不会使用 FSW。
      • 进程本身需要能够处理 20 - 30 个不同的文件并将它们放置在所需的位置......这也不是项目特定的功能。它已经并将继续用于整个公司的多个不同项目中。
      • 不确定这有什么关系。引用我帖子的重要部分:“您需要等待,您无法预测何时完成。”
      【解决方案4】:

      请注意,NotifyFilters.LastAccess 并不意味着您会知道其他进程何时完成了该文件。它只是意味着您会在文件的上次访问时间发生更改时收到通知。

      我通常采用 Brian Gideon 的生产者-消费者模式。这也使得过滤掉FileSystemWatcher 愉快分发的(典型的)多个Changed 事件变得容易。

      (几乎)确定其他进程已完成文件的唯一方法是尝试获得对其的排他锁。但是,这并不总是足够的。我见过一个 FTP 服务器,它为它写的每个块关闭并重新打开文件 ;-)

      还请注意,FileSystemWatcher 确实有一个内部缓冲区,用于缓冲从 Windows 获得的文件通知,但如果发生很多情况,该缓冲区可能会溢出。这又是创建生产者-消费者的原因。

      我通常通过创建一个例程来修改这一点,该例程可以手动扫描监视的目录,然后偶尔运行一次。是的,投票;-)

      在启动您的应用程序时使用此例程也很不错。文件可能在停机时已到达!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-05
        相关资源
        最近更新 更多