【发布时间】:2019-05-16 02:37:27
【问题描述】:
我将我们的应用程序从 Windows 上的 C# 转换为在带有 Ryder IDE 框架的 Linux 上运行的.Net Core。
我们的应用使用多个第三方框架,例如 ServiceStack、RabbitMq 和 Mailkit 库。
当我打开“调试输出”窗口时,我看到系统正在以超过 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