锁定和同步

本文关键字:同步 锁定 | 更新日期: 2023-09-27 18:07:30

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

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;
    }
}

我确实有FileStreams,但是我正确地关闭了它们。我认为这些都不是问题所在

当我第一次运行程序时,它会异常地进入catch: File cannot be accessed.第二个文件复制到目录,它给了我:object synchronization method was called from an unsynchronized block of code。此例外在monitor.exit(lockobject)上给出。

关于我的程序的大致想法,以及我想要实现的目标:

有一个FileSystemWatcher正在运行,当它拾取文件更改时,我处理该文件并在UI (ListBox)上报告它。你能解释一下是什么导致了我所看到的异常吗?

锁定和同步

您误解了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? 
  }
}

考虑到您得到的异常可能是需要延迟,但是我遇到了文件系统监视器在"违规"应用程序关闭其流之前触发事件的问题,即在打开文件时发生碰撞。对于延迟的长度,没有"通用"的经验法则,但是要以比磁盘延迟更高的时间为目标,特别是对于网络驱动器!例如,在SSD上,您可能需要10毫秒,而网络硬盘驱动器可能需要接近100毫秒。