锁定事件的FileSystemWatcher
本文关键字:FileSystemWatcher 事件 锁定 | 更新日期: 2023-09-27 18:29:05
我有以下代码:
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中共存,即使有锁机制,为什么??
lock
不会导致正在使用的线程发生更改。我只是阻止多个线程同时访问该块中的代码。
这里获得多个线程的原因是FileSystemWatcher
在线程池线程上引发其Changed
事件。
如果希望DispatchResult
出现在单个线程上,则需要使用某种形式的SynchronizationContext
将结果推回到该线程上。在UI应用程序中,这通常通过例如Control.Invoke
或Dispatcher.Invoke
来完成。
顺便说一句,最好避免使用lock(this)
,而是创建一个仅用于锁定的私有对象。否则,另一个对象可能会锁定您的同一实例并导致各种问题。