FileSystemWatcher锁定事件

时间:2012-03-27 15:42:39

标签: c# multithreading 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中的不同线程共存,即使有一个锁定机制, 怎么来的?

1 个答案:

答案 0 :(得分:2)

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

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

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

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