C# 锁定和同步

C# 锁定和同步,c#,.net,locking,filesystemwatcher,C#,.net,Locking,Filesystemwatcher,我很难找出以下代码的问题: public void InitList(object source, FileSystemEventArgs f) { if (!Monitor.TryEnter(lockObject)) { Monitor.Exit(lockObject); return; } try { /// do something } catch (Exception e) {

我很难找出以下代码的问题:

public void InitList(object source, FileSystemEventArgs f)
{
    if (!Monitor.TryEnter(lockObject))
    {
        Monitor.Exit(lockObject);
        return;
    }
    try
    {
        /// do something
    }
    catch (Exception e)
    {
        MessageBox.Show("The Process Failed:" + e.ToString());
    }
    finally
    {
        Monitor.Exit(lockObject);

        _watcher.Path = textBox2.Text;

        _watcher.EnableRaisingEvents = true;
    }
}
我确实有文件流,但我正在正确地关闭它们。我相信这不是问题所在

当我第一次运行该程序时,它会转到catch,但有一个例外:
文件无法访问。
当第二个文件复制到目录时,它会给我:
对象同步方法是从未同步的代码块调用的
。此异常在
监视器.exit(lockobject)
上给出

大致了解我的计划,以及我正在努力实现的目标:


有一个FileSystemWatcher正在运行,当它拾取已更改的文件时,我将处理该文件并在UI(列表框)上报告它。您能解释一下导致我看到的异常的原因吗?

您误解了Monitor.TryEnter(obj)的功能,如果它返回false,您就不必再次退出,因为您从未输入过

通常您使用
Monitor
如下:

void MyMethod() {
  if (Monitor.TryEnter(lockObj)) {
    // Do stuff
    // Release lock
    Monitor.Exit(lockObj);
  } else {
    // We didn't get a lock, crash? Log? 
  }
}

考虑到您遇到的异常情况,可能需要延迟,但我遇到了filesystemwatcher在“违规”应用程序关闭其流之前触发事件的问题,即打开文件时发生冲突。对于延迟的时间长短没有“一般”的经验法则,但要瞄准比磁盘延迟更高的时间,尤其是对于网络驱动器!Ie在SSD上,您可能需要10毫秒,而联网硬盘可能需要接近100毫秒。

我尝试了您的方法,但仍然出现catch异常,System.IO异常,进程无法访问文件。@user726720现在与线程无关,这只是因为其他人正在打开该文件进行修改:)您确定在读取/修改后正确关闭了该文件吗?@user726720然后其他人正在打开该文件进行修改。试着稍微延迟一下,看看效果是否更好。你的代码可能会在文件关闭前触发。我已经设置了1000毫秒的延迟,但这似乎会促使FSW在每次检测时运行4次。它似乎工作正常。我已经设置了75毫秒的延迟,1000毫秒太多了。请把你的想法作为答案,这样我就可以接受了。谢谢。你很少能读到你收到FSW事件的文件。因为另一个进程正忙于修改文件。您必须等待任意长的时间,直到该进程关闭文件。当您没有获取监视器时调用Monitor.Exit()是一个明显的错误。没有其他进程在后台运行来控制文件。因为我只是简单地将文件复制/粘贴到文件夹中。所以当FSW开火时。它触发了4个事件(根据msdn fsw手册),现在我有了一个逻辑来抑制这四个事件,并且只触发一个。但我的锁似乎不能正常工作。如果您要检查,请查看我的代码: