我有以下代码:
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 :(得分:2)
lock
不会导致使用的线程发生变化。我只是阻止多个线程同时访问该块中的代码。
你在这里获得多个线程的原因是FileSystemWatcher
在线程池线程上引发了它的Changed
事件。
如果您想在单个线程上发生DispatchResult
,则需要使用某种形式的SynchronizationContext
将结果推回到该线程。在UI应用程序中,这通常通过Control.Invoke
或Dispatcher.Invoke
完成,例如。
另一方面,最好避免使用lock(this)
,而是创建一个仅用于锁定的私有对象。否则,另一个对象可能会锁定同一个实例并导致各种问题。