【问题标题】:Does Debug.Writeline in VB.NET stop thread execution?VB.NET 中的 Debug.Writeline 是否停止线程执行?
【发布时间】:2023-03-17 10:35:01
【问题描述】:

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

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

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

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

Debug 或 Trace 语句有什么特别之处使它们成为非线程安全的吗?

为什么这会挂掉?如果我留下调试语句,线程永远不会完成。如果我去掉调试语句,线程会在不到 5 秒的时间内完成。

【问题讨论】:

  • 能否提供触发挂起的代码? Debug 和 Trace 类是线程安全的,所以这很奇怪。

标签: vb.net multithreading


【解决方案1】:

是和不是。

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

可能有 2 个线程同时命中此 WriteLine 语句,因此有一个线程暂停一小段时间。自定义跟踪侦听器也有可能执行非常长的生命周期或阻塞操作,这实际上会冻结所有其他线程一段明显的时间。

使用 Visual Studio 检查并查看此函数中当前有哪些其他线程被破坏。看看这是否能让你知道是什么阻碍了这个过程。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      此应用程序中有一个自定义跟踪侦听器。一旦我将其注释掉,我的锁定问题就解决了。现在,如果我只能追踪原始开发人员以了解他们使用这个自定义侦听器做了什么……

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-29
        • 2016-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多