锁定事件的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中共存,即使有锁机制,为什么??

锁定事件的FileSystemWatcher

lock不会导致正在使用的线程发生更改。我只是阻止多个线程同时访问该块中的代码。

这里获得多个线程的原因是FileSystemWatcher在线程池线程上引发其Changed事件。

如果希望DispatchResult出现在单个线程上,则需要使用某种形式的SynchronizationContext将结果推回到该线程上。在UI应用程序中,这通常通过例如Control.InvokeDispatcher.Invoke来完成。

顺便说一句,最好避免使用lock(this),而是创建一个仅用于锁定的私有对象。否则,另一个对象可能会锁定您的同一实例并导致各种问题。