我想知道一种调用Monitor.TryEnter的故障安全方法。 文档显示如下:
if (Monitor.TryEnter(lockObj)) {
try {
// The critical section.
}
finally {
// Ensure that the lock is released.
Monitor.Exit(lockObj);
}
}
因为这是'官员'打电话的方式,我犹豫什么别的。但我觉得这段代码不太舒服: 假设我们得到这样的ThreadAbortException:
if (Monitor.TryEnter(lockObj)) {
// *** ThreadAbortException happens exactly here
try {
[...]
}
finally { [...] }
}
这不会给我带来永不释放的锁吗?
答案 0 :(得分:2)
你是对的。因此,建议使用Monitor.TryEnter
的方法是:
bool lockAcquired;
try
{
Monitor.TryEnter(lockObj, ref lockAcquired);
if (lockAcquired)
{
DoSomething();
}
}
finally
{
if (lockAcquired)
{
Monitor.Exit(lockObj);
}
}
答案 1 :(得分:0)
可以。你可以用try finally块(带有布尔重载)包含所有Monitor
。
关于ThreadAbortException
的示例,这是特别之处。
如果它在卸载应用程序域后通过CLR抛出,CLR会照顾您执行它所需的操作,之后不会在此应用程序域中运行任何代码,因此您不必担心。
如果你手动扔它,无论如何都会处于不良状态......
侧面注意看一下here,关于编码人员在发生异常时释放锁的信任。