2012-03-27 2 views
1

У меня есть следующий код:FileSystemWatcher с замком на событиях

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 даже есть механизм блокировки, Как так??

+0

Вы понимаете последствия ['lock'ing on' this'] (http://stackoverflow.com/questions/251391/why-is-lockthis-bad)? –

+0

спасибо за ваш ответ, но все же, почему 2 потока прошли через замок? – user829174

+0

@ user829174 Два потока могут проходить через замок, но не в то же время ... Это все блокировка. –

ответ

1

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

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

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

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

Смежные вопросы