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之前的最后一个异步异常中会发生什么?
引发此异常时,运行时会在结束线程之前执行所有finally块.