如何在不释放锁的情况下退出锁定语句?

Cod*_*der 4 c#

我有一个奇怪的问题,一个死锁问题,如果我使用Visual Studio暂停程序并检查线程,我只能看到两个线程在等待锁.没有线程出现在锁定范围内!Visual Studio只是说谎或者如何在不释放锁的情况下退出锁定语句?

谢谢

Eri*_*ert 9

这可能在以下情况下发生.假设你有

Enter();
try
{
   Foo();
}
finally
{
   Exit();
}
Run Code Online (Sandbox Code Playgroud)

并且在尝试之后但在尝试之前抛出线程中止异常.现在已经输入了监视器,但是终于永远不会运行,因为在尝试之前抛出了异常.

我们已经修复了C#4中的这个缺陷.在C#4中,lock语句现在生成为

bool mustExit = false;
try
{
    Enter(ref mustExit);
    Foo();
}
finally
{
    if (mustExit) Exit();
}
Run Code Online (Sandbox Code Playgroud)

当然,事情仍然可能是错误的; 中止线程并不能保证线程永远中止,最终阻塞运行,等等.您仍然可以在未处理的异常事件处理程序中结束锁定.但这至少要好一点.

  • 我正准备发布同样的事情,因为我记得在"The C#Programming Language,3rd Ed."中读到了这个效果的注释,但是你打败了我.但是,当我查阅参考文献时,我记得的那张纸条(在第8.12节,第8.12节)实际上是由你写的,所以我猜你*真的*打败了我... :-) (3认同)