我有一个奇怪的问题,一个死锁问题,如果我使用Visual Studio暂停程序并检查线程,我只能看到两个线程在等待锁.没有线程出现在锁定范围内!Visual Studio只是说谎或者如何在不释放锁的情况下退出锁定语句?
谢谢
这可能在以下情况下发生.假设你有
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)
当然,事情仍然可能是错误的; 中止线程并不能保证线程永远中止,最终阻塞运行,等等.您仍然可以在未处理的异常事件处理程序中结束锁定.但这至少要好一点.
| 归档时间: |
|
| 查看次数: |
307 次 |
| 最近记录: |