Ste*_*eed 2 debugging multithreading visual-studio-2010
我有这个问题一直给我带来悲伤的一天,然后一些.
基本上我的Debug.WriteLine工作了一点,然后神奇地停止给出输出.调试器仍在工作,因为我可以在行上放置一个断点,它会中断,我可以跳过Debug.WriteLine并观察它不输出.
现在我已经检查了我能想到的一切.我曾经尝试过各种各样的帖子
但没有任何效果.澄清
在完成所有建议之后,我没有修复.上述帖子中没有一个真正得到回答.
那么如何解决这个问题呢?
我以为我会创建一个单独的解决方案来重现这个问题.
您可以下载我的解决方案,在此处重现该错误https://drive.google.com/uc?export=download&confirm=&id=0B0SLafLeQj5GOGxORThMWWhYV28
所以我制作了2个Windows应用程序,并将它们设置为同时启动.在每个应用程序中,我启动一个线程,在线程中我做一个Debug.WriteLine
它似乎得到某种死锁并停止写输出.这似乎是Visual Studio中的一个错误,我对此感到非常惊讶.我是否必须相信,有两个项目的线程同时执行Debug.WriteLine是不可能的?
再一次,我非常需要一种方法来解决这个问题并且仍然获得调试输出.哦,我也尝试过将输出重定向到即时窗口的选项,但也没有成功.
视觉工作室似乎有一个错误.我使用.net反射器深入研究CLR并发现它的锁定似乎只适用于每个进程级别.因此,当您只运行一个项目时,DefaultTraceListener似乎可以正常使用多线程,但是只要您运行多个项目,它就会产生某种死锁并停止工作.
我通过为Debug.WriteLine创建一个包装器来解决这个问题,然后我将Global Mutex实现为围绕写入的锁定.Mutex是win32互斥锁的包装器,因此可以在系统上的进程级别上运行.
在这里看到我的代码,我把它放在我在两个项目中引用的类lib中,而不是使用System.Diagnostics下的普通Debug.WriteLine:
public class Debug
{
#if DEBUG
private static readonly Mutex DebugMutex =new Mutex(false,@"Global\DebugMutex");
#endif
[Conditional("DEBUG")]
public static void WriteLine(string message)
{
DebugMutex.WaitOne();
System.Diagnostics.Debug.WriteLine(message);
DebugMutex.ReleaseMutex();
}
[Conditional("DEBUG")]
public static void WriteLine(string message, string category)
{
DebugMutex.WaitOne();
System.Diagnostics.Debug.WriteLine(message,category);
DebugMutex.ReleaseMutex();
}
}
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助 !
骏马.
| 归档时间: |
|
| 查看次数: |
876 次 |
| 最近记录: |