如何在多线程c#程序中找到死锁的原因?

joh*_*een 5 c# multithreading

基本上我有ac#server程序(不在IIS中的控制台应用程序)偶尔会进入死锁状态.

有一件事很奇怪,当我连接调试器时,我看到3个线程正在等待一个锁,但锁内没有线程(使用visual studio中的线程窗口)!这里发生了什么......我猜视觉工作室调试器正在撒谎.

但无论如何......我应该使用哪些技术或工具?

谢谢

Aar*_*ght 6

我会从每次线程即将进入/离开关键部分以及每次成功获取锁定时发送跟踪输出开始.使用该System.Diagnostics.Trace课程.

然后,您应该能够从跟踪输出中确定哪个线程实际上具有锁定.

典型的跟踪代码:

Trace.WriteLine("Acquiring lock - foo");
lock (foo)
{
    Trace.WriteLine("Acquired lock - foo");
    // Do some stuff
    Trace.WriteLine("Releasing lock - foo");
}
Trace.WriteLine("Released lock - foo");
Run Code Online (Sandbox Code Playgroud)

根据程序的结构方式,除非在跟踪输出中包含线程信息,否则这可能没有用,例如:

Trace.WriteLine(string.Format("Thread {0} - Acquiring lock - foo",
    Thread.CurrentThread.ManagedThreadId));
Run Code Online (Sandbox Code Playgroud)

一旦你弄清楚哪个线程锁,你就可以进入调试器并查看它正在等待哪个锁,然后使用相同的跟踪输出来确定谁拥有另一个锁.在大多数情况下,将有两个线程参与死锁,这将让您找到它们.