如何调用Monitor.TryEnter

时间:2016-06-16 05:26:31

标签: c#

我想知道一种调用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 { [...] }
}

这不会给我带来永不释放的锁吗?

2 个答案:

答案 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,关于编码人员在发生异常时释放锁的信任。