我的程序经常因死锁而停止。当我进行一次破解并查看线程时,我看到三个线程卡在我们的日志记录功能中:
public class Logging
{
public static void WriteClientLog(LogLevel logLevel, string message)
{
#if DEBUG
System.Diagnostics.Debug.WriteLine(String.Format("{0} {1}", DateTime.Now.ToString("HH:mm:ss"), message)); //LOCK
#endif
//...Log4net logging
}
}
如果我让程序继续,则线程仍然停留在该行上。
我无法看到它可以锁定的位置。调试类,字符串类& datetime类似乎是线程安全的。
当我删除#if DEBUG System... #endif
代码时,错误就消失了,但我很好奇为什么会出现这种情况。
线程一:
public void CleanCache()
{
Logging.WriteClientLog(LogLevel.Debug, "Start clean cache.");//Stuck
}
线程二:
private void AliveThread()
{
Logging.WriteClientLog(LogLevel.Debug, "Check connection");//Stuck
}
答案 0 :(得分:4)
Debug.WriteLine将记录消息写入附加到Listeners集合的附加跟踪侦听器。
其中一个跟踪侦听器必须在内部具有锁定,从而导致死锁。检查你的听众代码,因为它很可能是罪魁祸首。