似乎这些代码片段的行为应该相同:
if (Monitor.TryEnter(lockObject))
{
try
{
DoSomething();
}
finally
{
Monitor.Exit(lockObject);
}
}
bool lockAcquired;
try
{
Monitor.TryEnter(lockObject, ref lockAcquired);
if (lockAcquired)
{
DoSomething();
}
}
finally
{
if (lockAcquired)
{
Monitor.Exit(lockObject);
}
}
我在the overload taking a ref bool
parameter上的MSDN文档中看到:
如果因为没有采取锁定 异常被抛出,变量 为 lockTaken 参数指定的 此方法结束后 false 。这个 允许程序确定,在 所有情况下,是否有必要 释放锁。
但是文档也表明只有object
参数的重载不会引发除ArgumentNullException
以外的任何异常。因此,如果在上面的代码段 1 中抛出了异常,它可能只是因为lockObject
是null
,在这种情况下没有锁定(和{{无论如何,1}}都会返回TryEnter
),因此不需要false
来电。
Monitor.Exit
方法旨在解决什么情况?
答案 0 :(得分:7)