VB.NET中的Debug.Writeline是否会停止线程执行?

时间:2009-08-19 13:36:06

标签: vb.net multithreading

我有一个VB.NET应用程序,它使用线程异步处理“计划任务”(控制台应用程序)中的某些任务。

我们限制此应用程序一次运行10个线程,如下所示:

(伪代码)   - 创建10个线程的通用列表   - 为每个人生成threadproc   - 为每个线程执行thread.join语句,以等待运行时间最长的线程完成。

我发现如果threadproc调用的代码包含任何“Debug.Writeline”或“Trace.Traceinformation”语句,则线程会挂起。我可以在Debug - Windows - Threads窗口中看到该线程并切换到它,但它会突出显示Debug.Writeline语句并且永远不会超过它。

Debug或Trace语句有什么特别的东西使它们不是线程安全的吗?

为什么会挂起来?如果我保留调试语句,则线程永远不会完成。如果我取出调试语句,则线程在不到5秒的时间内完成。

3 个答案:

答案 0 :(得分:3)

是和否。

在内部,Debug.WriteLine最终调用TraceInternal.WriteLine。此特定函数不会显式停止线程执行,但它会在执行方法期间获取进程全局锁定。此锁保护跟踪侦听器列表并序列化WriteLine命令的处理。

2个线程可能同时命中此WriteLine语句,因此在短时间内有一个线程暂停。自定义跟踪侦听器也可以执行非常长时间的操作或阻塞操作,这将基本上冻结所有其他线程一段时间。

使用Visual Studio检查并查看此函数中当前还有哪些其他线程被破坏。看看是否能为您提供有关阻止此过程的线索。

答案 1 :(得分:0)

您可能有一个可能干扰Debug.WriteLine的跟踪侦听器。

答案 2 :(得分:0)

此应用程序中有一个自定义跟踪侦听器。一旦我评论出来,我的锁定问题就解决了。现在,如果我只能跟踪原始开发人员,了解他们使用此自定义侦听器做了什么......