锁定和同步

时间:2014-06-09 06:43:52

标签: 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)
    {
        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)上提供。

关于我的计划的IDEA粗糙,以及我正在努力实现的目标:

运行FileSystemWatcher,当它接收到更改的文件时,我处理此文件并在UI(ListBox)上报告。你能解释一下导致我看到的异常的原因吗?

1 个答案:

答案 0 :(得分:1)

您误解了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在"冒犯"之前触发了事件。应用程序已关闭其流,即打开文件时发生冲突。没有"一般"关于延迟必须持续多长时间的经验法则,但目标是高于磁盘延迟,特别是对于网络驱动器!即在SSD上,您可能会在10毫秒内逃脱,而网络硬盘驱动器可能需要接近100毫秒。

相关问题