【问题标题】:FileSystemWatcher doesnt work properly WPFFileSystemWatcher 无法正常工作 WPF
【发布时间】:2016-12-08 09:27:53
【问题描述】:

FileSystemWatcher 无法正常工作。它仅在第一次更改发生时响应。如果我随后更改第二个文件,则不会发生任何事情。

public class ImageViewModel : INotifyPropertyChanged
{
    public static ImageViewModel singletonInstance { get; set; }

    FileSystemWatcher watcher;
    private readonly BackgroundWorker worker1;

    public ImageViewModel()
    {
        ...

        watcher = new FileSystemWatcher(RootPath);
        watcher.EnableRaisingEvents = true;
        watcher.IncludeSubdirectories = true;
        watcher.Changed += new FileSystemEventHandler(watcher_Changed);

        this.worker1 = new BackgroundWorker();
        this.worker1.DoWork += this.DoWork1;
        this.worker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker1_Completed);
    }

    ...

    private void watcher_Changed(object sender, FileSystemEventArgs e)
    {
        editedFile = e.FullPath;

        if (worker.IsBusy == true || worker1.IsBusy == true)
        {
            autoEvent.WaitOne();
        }

        else
        {
            this.worker1.RunWorkerAsync();
        }
    }
}

你能帮我解决这个问题吗?

【问题讨论】:

  • 你的 watcher 只工作一次似乎很奇怪。你确定你没有在 watcher_changed 中禁用它吗?
  • 错误是什么? 无法正常工作并没有真正帮助我们。
  • BackgroundWorker 与此有​​什么关系?为什么watcher 字段不是private readonly,比如worker1?你在watcher_Changed做什么?请提供minimal, complete, and verifiable example
  • 不能正常工作 -> watcher 只能工作一次!
  • 可以发DoWork1的代码吗?

标签: c# wpf mvvm filesystemwatcher


【解决方案1】:

在您通过调用 AutoResetEvent 的 Set() 方法发出信号之前,不会再次调用 watcher_Changed 事件处理程序。以下调用将阻塞 UI 线程,当它被阻塞时它不能处理任何事件:

autoEvent.WaitOne();

如果您暂时从 watcher_Changed 事件处理程序中删除所有代码,并在其中设置一个断点并调试您的应用程序,您应该会看到它实际上在每次文件更改时都会受到影响:

private void watcher_Changed(object sender, FileSystemEventArgs e)
{
    int d = 1; // set a breakpoint on this line, debug your application and modify the file
}

但请记住始终发布您的问题的最小、可编译和可运行的示例。

【讨论】:

  • 我使用了autoEvent.WaitOne(),因为我使用了两个BackgroundWorkers,它们不应该同时运行。在 BackgroundWorker 开始完成任何事情之前,它应该始终等待另一个完成其工作,然后自动启动。我怎么能意识到这一点???
  • 这确实是另一个问题。但是您必须从某个地方调用 autoReset.Set() 以便 UI 线程能够处理事件。例如,您可以在 BackgroundWorker 的 RunWorkerCompleted 事件的事件处理程序中执行此操作。但是,如果您有其他问题,请提出一个新问题。
猜你喜欢
  • 2011-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多