.net 为什么Monitor.Enter/Exit与lock()语句相比不可靠?

.net 为什么Monitor.Enter/Exit与lock()语句相比不可靠?,.net,multithreading,.net,Multithreading,可靠地锁定关键截面和 lock (mutexProviderService.GetMutex(lockName)) {} 这是不可靠的。手动调用使用相同实例参数确定调用的Enter/Exit有什么问题? 附带说明:MSDN中命名的互斥体代码比这个类大得多,也更复杂。这实际上并不是你问题的答案,但从c#4.0开始,lock生成下一个代码(阅读文章): 你说它不可靠是什么意思?您是否有一些测试场景来向我们展示此代码是如何失败的?如果看不到{}块中的内容,就很难判断。最明显的问题是,如果在您的Ent

可靠地锁定关键截面和

lock (mutexProviderService.GetMutex(lockName)) {}
这是不可靠的。手动调用使用相同实例参数确定调用的Enter/Exit有什么问题?
附带说明:MSDN中命名的互斥体代码比这个类大得多,也更复杂。

这实际上并不是你问题的答案,但从c#4.0开始,

lock
生成下一个代码(阅读文章):


你说它不可靠是什么意思?您是否有一些测试场景来向我们展示此代码是如何失败的?如果看不到
{}
块中的内容,就很难判断。最明显的问题是,如果在您的
Enter
Exit
调用之间发生了
lockName
变异,“不可靠”不是问题陈述。请非常清楚什么不起作用,以及您如何确定它不可靠。你需要确保阅读你文章的人和你一样知道发生了什么、失败、错误消息、执行了哪些代码等等。
lock (mutexProviderService.GetMutex(lockName)) {}
mutexProviderService.Enter(lockName);
try { }
finally
{
    mutexProviderService.Exit(lockName);
}
bool lockWasTaken = false;
var temp = obj;
try
{
    Monitor.Enter(temp, ref lockWasTaken);
    { body }
}
finally
{
    if (lockWasTaken) Monitor.Exit(temp);
}