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

时间:2010-12-22 12:49:20

标签: c# multithreading

一个。在这种情况下,此代码失败:

try
{
    Monitor.Enter(someObj);
    //Do something important
}
finally
{
    Monitor.Exit(someObj);
}

此代码不会失败:

Monitor.Enter(someObj);
try
{
    //Do something important
}
finally
{
    Monitor.Exit(someObj);
}

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

由于

1 个答案:

答案 0 :(得分:5)

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

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

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

为什么,请参阅Eric Lippert's blog

但不然:第二个;否则,如果Enter调用失败(任何方法调用失败),则您尝试Exit锁定您没有