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

标签 vb.net multithreading

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

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

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

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

使Debug或Trace语句具有非线程安全性吗?

为什么这会挂断电话?如果我保留debug语句,则线程将永远无法完成。如果我取出debug语句,线程将在不到5秒的时间内完成。

最佳答案

是的,没有。

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

2个线程可能同时命中此WriteLine语句,因此有一个线程在短时间内暂停。自定义跟踪监听器还可能执行很长的生存期或阻塞操作,这实际上会使所有其他线程冻结相当长的时间。

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

关于vb.net - VB.NET中的Debug.Writeline是否停止线程执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1299967/

相关文章:

java - 为什么在这个多线程程序中没有同步访问synchronized方法呢?

.net - VB.NET:如何防止用户在组合框中输入

c# - ASP.NET 网站在 IE10 上看起来不同

vb.net - VB.NET 中的“提取接口(interface)”?

mysql - 尝试执行不包含指定表达式 'StaffDetails.StaffID' 作为聚合函数一部分的查询

objective-c - 提高代码 objective-c 的处理速度

c - 没有第一条语句的循环(C 到 Visual Basic)

java - MyThread 类的更好技术

linux - mmap 与 malloc : strange performance

multithreading - QRunnable 试图中止任务