Debug.WriteLine锁定问题

7

我的程序经常出现死锁。当我使用break-all并查看线程时,发现三个线程被卡在我们的日志函数中:

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
    }
}

如果我让程序继续运行,线程仍然会停留在那一行。
我看不出这里哪里可能会锁死。调试类、字符串类和日期时间类似乎都是线程安全的。
当我删除#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
}

那么,如果你只是删除if debug和endif消息,但在方法中保留write line,它就可以正常工作了吗? - Tejs
你是否配置了自定义跟踪侦听器? - Chris Taylor
我遇到了类似的问题...最终我转而使用微软的企业库日志记录,这样做让我少了很多麻烦。 - Jason M
没有自定义跟踪侦听器,我只在调试列表中看到默认的跟踪侦听器。 - Carra
1个回答

7

Debug.WriteLine会将日志消息写入附加到Listeners集合中的跟踪侦听器。

你的一个跟踪侦听器内部必须有一个锁,导致死锁。检查您的侦听器代码,因为它很可能是罪魁祸首。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接