FileSystemWatcher с блокировкой на событие - PullRequest
1 голос
/ 27 марта 2012

У меня есть следующий код:

private void WatchFileForChanges()
{
    if (fileInfo.Directory != null)
    {
        _watcher = new FileSystemWatcher(fileInfo.Directory.FullName, fileInfo.Name);
        _watcher.NotifyFilter = NotifyFilters.LastWrite;
        _watcher.Changed += OnFinalBuilderStatusChanged;
        _watcher.EnableRaisingEvents = true;
    }
}

private void OnChanged(object source, FileSystemEventArgs e)
{
    lock (this)
    {
       // here i see 2 different threads coexist
       // even there is a lock!!
       DispatchResult();
    }
}

, как можно петь в комментарии, я вижу, что в OnChanged сосуществуют разные потоки, даже если есть механизм блокировки, как же это получается ??

1 Ответ

2 голосов
/ 27 марта 2012

lock не приводит к изменению используемого потока.Я просто запрещаю нескольким потокам одновременно обращаться к коду внутри этого блока.

Причина, по которой вы получаете несколько потоков, заключается в том, что FileSystemWatcher вызывает событие Changed в потоке потоков.

Если вы хотите, чтобы DispatchResult встречалось в одном потоке, вам нужно использовать некоторую форму SynchronizationContext, чтобы вернуть результат обратно в этот поток.В приложении с пользовательским интерфейсом это обычно делается, например, с помощью Control.Invoke или Dispatcher.Invoke.

На заметку о том, что лучше не использовать lock(this), а вместо этого сделать закрытый объект,используется только для вашей блокировки.В противном случае другой объект может заблокировать ваш экземпляр и вызвать всевозможные проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...