【问题标题】:Debug Output window shows "Starting Thread" and "Stopping Thread" over and over调试输出窗口一遍又一遍地显示“启动线程”和“停止线程”
【发布时间】:2019-05-16 02:37:27
【问题描述】:

我将我们的应用程序从 Windows 上的 C# 转换为在带有 Ryder IDE 框架的 Linux 上运行的.Net Core

我们的应用使用多个第三方框架,例如 ServiceStack、RabbitMqMailkit 库。

当我打开“调试输出”窗口时,我看到系统正在以超过 10 秒的速度启动和停止线程。

Started Thread 18213
Exited Thread 18213
Started Thread 18214
Exited Thread 18214
Started Thread 18215
Exited Thread 18215
Started Thread 18216
Exited Thread 18216
Started Thread 18217
Exited Thread 18217
Started Thread 18218

由于有 100 个类,我不知道从哪里开始查看以这种速度启动和停止线程的方法。

我怎样才能找到它?

  • 有没有一种方法可以在线程池上重载,允许我们在这些线程启动和停止时设置断点。

  • 我已尝试启用 settings > Build, Execution > Debugger > Process exceptions outside of my code,并且我看到 RabbitMQ 库中抛出了很多异常,但我不知道这是否与线程循环问题有关。

  • 我启用了System.Treading.ThreadStartExcepton,但它没有被击中。

任何帮助将不胜感激。

【问题讨论】:

  • 如果你能提供minimal reproducible example就太好了
  • 应用程序超过 100K 行。我不知道我怎么能做到这一点。建议?
  • @mbalsam 这就是需要 MCVE 的原因。如果您需要整个应用程序来调试或解决问题,那么查找和修复问题将变得更加困难。将 small 部分隔离到一个单独的应用程序中(一个简单的控制台应用程序应该这样做)并检查它们的行为方式。我怀疑没有任何问题,也没有例外,只是异步/多线程库在做他们的工作
  • 如果您想查看应用程序中发生了什么,请对其进行概要分析并检查发生了什么。 IntelliTrace 已经可以记录线程事件。 Visual Studio 的分析器可以捕获和可视化任务、线程事件等。Concurrency Visualizer 扩展可以可视化所有这些,显示哪个任务在哪个内核上运行,哪个任务或线程被哪个阻塞等等。
  • 既然你使用 Rider,你应该检查dotTrace。登陆页面显示线程事件的可视化,类似于 Concurrency Visualizer 的视图

标签: c# multithreading .net-core servicestack rider


【解决方案1】:

欢迎使用线程池.Net Core 和一般的异步等待。

你有什么问题吗?

这些输出 Started ThreadExited Thread 不是代码中的错误,而是 Asp.Net Core 框架的设计

线程池是按需提供的工作线程池 如所须。 article 中的代码示例展示了如何使用 .NET Core 中使用 C# 的线程池。

【讨论】:

  • 啊哈。谢谢。我认为它们值得担心。
【解决方案2】:

不幸的是,在 .NET 应用程序中没有跟踪启动或停止线程的机制。如果您在调试器中检查线程,您可以看到线程的调用堆栈,包括(在堆栈的底部)为启动线程工作而调用的方法。这可能会给你一些关于线程应该做什么的信息。

现实情况是,如果不是您的代码,您可能无法对这些线程的管理方式做太多事情。您可能会看到 .NET 线程池的正常行为。除非您看到大量线程或线程周转率非常高的问题,否则最好不要拉此线程。

【讨论】:

  • 这些事件可供分析器和 Intellitrace 使用。它们已被 Visual Studio 的分析器、dotTrace 和 IntelliTrace 窗口捕获和可视化
猜你喜欢
  • 1970-01-01
  • 2011-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-16
  • 1970-01-01
  • 1970-01-01
  • 2019-07-01
相关资源
最近更新 更多