我很难用以下代码解决问题:
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)上报告。你能解释一下导致我看到的异常的原因吗?
答案 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毫秒。