如果您有一些代码块要阻止在退出和清理对象时执行,可以使用锁来阻止执行吗?
Monitor.TryEnter(cleanupLock, ref acquiredLock);
TryEnter可用于确保代码不被执行,并且由于它不等待锁定,因此不会出现死锁。
另一个线程在确定是时候关闭时会抓住锁。
Monitor.Enter(cleanupLock);
如果清理线程从不调用
Monitor.Exit(cleanupLock);
这会导致问题吗?
答案 0 :(得分:8)
是的,没有为成功Monitor.Exit
或Monitor.TryEnter
调用Monitor.Enter
是快速解决应用程序中的死锁问题。您可能能够在非常有限的情况下使用它,但最终代码或方案会发生变化,而 会回来咬你。只是不要这样做。
答案 1 :(得分:6)
唯一的“问题”是没有其他代码能够获取对cleanupLock变量的锁定。
这可能是也可能不是问题 - 但是,它有点滥用Monitor,所以我会避免这样做。最好以更常见的方式处理这种情况,IMO。
答案 2 :(得分:1)
如果这是一个清理关闭序列,那么它或多或少都可以。你冒着某人在某个地方检查,冒险,等待获得cleanupLock的风险。它可以在没有被注意的情况下滑入代码,并在最令人尴尬的时刻出现。结果将是一个拒绝关闭的线程,可能会使进程保持活跃状态。但是,在一天结束时,您将使用任何其他方法(例如全局关闭标志)运行相同的风险。
答案 3 :(得分:0)
这会导致问题吗?
是。锁永远不会被释放。
调用线程必须拥有obj参数的锁。如果调用线程拥有对指定对象的锁定,并且对该对象进行了相同数量的Exit和Enter调用,则释放锁定。如果调用线程没有像Enter那样多次调用Exit,则不会释放锁定。