调用Monitor.Enter一个try语句vs在try语句之外调用它

Ika*_*aso 4 c# multithreading

一个.在哪些情况下此代码失败:

try
{
    Monitor.Enter(someObj);
    //Do something important
}
finally
{
    Monitor.Exit(someObj);
}
Run Code Online (Sandbox Code Playgroud)

而且这段代码不会失败:

Monitor.Enter(someObj);
try
{
    //Do something important
}
finally
{
    Monitor.Exit(someObj);
}
Run Code Online (Sandbox Code Playgroud)

湾 当您没有使用using语句包装临界区时,您使用哪一个

谢谢

Mar*_*ell 5

好吧,lock(someObj)会更简单,并且在可用时将使用Monitor.NET 4中的新重载.

在.NET 4中,首选以下内容(emph:lock将为您执行此操作):

bool lockTaken = false;
try
{
    Monitor.Enter(lockObj, ref lockTaken);
    // do something important
}
finally
{
    if (lockTaken) Monitor.Exit(lockObj);
}
Run Code Online (Sandbox Code Playgroud)

为什么,请参阅Eric Lippert的博客

但否则:第二个; 否则,如果Enter调用失败(任何方法调用都可能失败),则尝试Exit使用您没有的锁.