如果没有匹配的Monitor.Exit,Monitor.Enter会发生什么?

Dou*_*son 7 .net c# multithreading

如果您有一些代码块要阻止在退出和清理对象时执行,是否可以使用锁来阻止执行?

Monitor.TryEnter(cleanupLock, ref acquiredLock);
Run Code Online (Sandbox Code Playgroud)

TryEnter可用于确保代码不被执行,并且由于它不等待锁定,因此不会出现死锁.

另一个线程在确定是否需要关闭时会抓住锁.

Monitor.Enter(cleanupLock);
Run Code Online (Sandbox Code Playgroud)

如果清理线程从不调用

Monitor.Exit(cleanupLock);
Run Code Online (Sandbox Code Playgroud)

这会导致问题吗?

Jar*_*Par 8

是的,不要求Monitor.Exit成功Monitor.TryEnterMonitor.Enter快速跟踪应用程序中的死锁.您可能能够在非常有限的情况下使其工作,但最终代码或方案将发生变化,这将会回来咬你.只是不要这样做.


Ree*_*sey 6

唯一的"问题"是没有其他代码能够获得对cleanupLock变量的锁定.

这可能是也可能不是问题 - 但是,它有点滥用Monitor,所以我会避免这样做.最好以更常见的方式处理这种情况,IMO.