.Net4,Monitor.Enter(lockObject,acquiredLock)

Gui*_*ume 3 .net locking thread-safety

在.Net4中,Monitor.Enter(Object)被标记为已废弃:

[ObsoleteAttribute("This method does not allow its caller to reliably release the lock.  Please use an overload with a lockTaken argument instead.")]
public static void Enter(
    Object obj
)
Run Code Online (Sandbox Code Playgroud)

并且有一个新方法Monitor.Enter(lockObject,acquiredLock)具有以下用法:

bool acquiredLock = false;

try
{
    Monitor.Enter(lockObject, ref acquiredLock);

    // Code that accesses resources that are protected by the lock.

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

我曾经这样做过:

Monitor.Enter(lockObject);
try
{

    // Code that accesses resources that are protected by the lock.
}
finally
{
    Monitor.Exit(lockObject);
}
Run Code Online (Sandbox Code Playgroud)

这是错的吗 ?为什么?也许在进入之后但在尝试之前进行了中断?
正如Eamon Nerbonne所问:如果在monitor.exit之前的最后一个异步异常中会发生什么?

答案:ThreadAbortException

引发此异常时,运行时会在结束线程之前执行所有finally块.

Jon*_*eet 5

正如您在问题的最后建议的那样,问题是在调用之后但在您进入块之前可能会抛出异步异常.Monitor.Entertry

新的做事方式确保无论发生什么,你都会遇到finally块并且如果你获得它就能释放锁.(Monitor.Enter例如,如果抛出异常,则可能无法获取它.)

IIRC,这是lock针对.NET 4.0时关键字的新行为.