Monitor.TryEnter(object)和Monitor.TryEnter(object,ref bool)之间存在什么重要的区别?

Dan*_*Tao 10 .net multithreading synchronization monitor .net-4.0

似乎这些代码片段的行为应该相同:

1:Monitor.TryEnter(对象)

if (Monitor.TryEnter(lockObject))
{
    try
    {
        DoSomething();
    }
    finally
    {
        Monitor.Exit(lockObject);
    }
}
Run Code Online (Sandbox Code Playgroud)

2:Monitor.TryEnter(object,ref bool) - 在.NET 4.0中引入

bool lockAcquired;
try
{
    Monitor.TryEnter(lockObject, ref lockAcquired);
    if (lockAcquired)
    {
        DoSomething();
    }
}
finally
{
    if (lockAcquired)
    {
        Monitor.Exit(lockObject);
    }
}
Run Code Online (Sandbox Code Playgroud)

我从MSDN文档中看到有关ref bool参数的重载:

如果因为抛出异常而未执行锁定,则在此方法结束后,为lockTaken参数指定的变量为false.这允许程序在所有情况下确定是否有必要释放锁.

但文档指出,仅使用object参数的重载不会引发除例外之外的任何异常ArgumentNullException.因此,它好像如果一个例外是在代码片段抛出1以上,它只能是因为lockObjectIS null,在这种情况下没有作出锁定(并TryEnter会一直返回false)反正,所以Monitor.Exit就没有必要了电话.

很明显,他们不会毫无理由地引入这种过载.那么该Monitor.TryEnter(object, ref bool)方法的目的是什么?

usr*_*usr 7

  1. Monitor.TryEnter可以成功,然后触发一个异步异常,如ThreadAbortException或OutOfMemoryException(可能在没有可见分配的情况下发生).然后锁定将被采取但从未释放.

请参阅:锁定和例外不混合

  • 哦,我看到了(访问过链接)...换句话说,在`TryEnter`之后但在进入`try` /`finally`块之前可能会抛出异常.得到它了. (3认同)