2016-12-08 7 views
-3

FileSystemWatcher работает неправильно. Он реагирует только тогда, когда происходит первое изменение. Если я затем изменил второй файл, ничего не произойдет.FileSystemWatcher не работает должным образом WPF

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(); 
     } 
    } 
} 

Помогите решить эту проблему?

+1

кажется странным, что ваш наблюдатель работает только один раз .. вы уверены, что не отключите его в watcher_changed? – BugFinder

+2

Какая ошибка? * не работает должным образом * на самом деле не помогает нам. – RandomStranger

+3

Что должно делать BackgroundWorker? Почему поле 'watcher' не' private readonly', как 'worker1'? Что вы делаете в 'watcher_Changed'? Укажите [минимальный, полный и проверяемый пример] (http://stackoverflow.com/help/mcve). – Clemens

ответ

1

Обработчик события watcher_Changed не будет вызываться повторно до тех пор, пока вы не будете сигнализировать, вызвав метод Set() для AutoResetEvent. Следующий вызов будет блокировать поток пользовательского интерфейса и в то время как он заблокирован он не может обрабатывать любые события:

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 
} 

Но, пожалуйста, помните, чтобы всегда после аа минимального, компилируемый и работоспособного образца вашего вопроса.

+0

Я использовал 'autoEvent.WaitOne()', потому что я использую два BackgroundWorkers, и они не должны запускаться одновременно. Перед BackgroundWorker начинает выполнять что угодно, он всегда должен ждать, пока другой выполнит свои работы, а затем запустится автоматически. Как я могу это понять? – Guilian

+0

Это еще один вопрос. Но вы должны вызвать autoReset.Set() откуда-то для потока пользовательского интерфейса, чтобы иметь возможность обрабатывать события. Например, вы можете сделать это в обработчике событий для события RunWorkerCompleted BackgroundWorker. Но, пожалуйста, задайте новый вопрос, если у вас есть другая проблема. – mm8