锁定和同步
本文关键字:同步 锁定 | 更新日期: 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毫秒。