当前逻辑线程增加/线程堆栈正在泄漏

Dav*_*veO 9 .net multithreading memory-leaks c++-cli

在性能监视器中监视我的.NET应用程序我可以看到.NET CLR LocksAndThreads /#当前逻辑线程随着时间的推移而稳步增长(当前为293),这表明线程堆栈正在泄漏.

我可以找到许多文章告诉我这是问题,但没有任何东西告诉我如何找到原因 - 那么我从哪里开始?Windbg可以告诉我问题出在哪里吗?

这是我3小时的性能监视器,告诉我当前的逻辑线程是150:

线程泄漏

这是线程窗口的输出,这并没有告诉我太多因为我无法访问他们的调用堆栈 - 它们大多被标记为[不可用]或[在睡眠中,等待或加入] | [外部代码]:

Unflagged       141024  124 Worker Thread   <No Name>       Normal
Unflagged   >   0   0   Unknown Thread  [Thread Destroyed]      
Unflagged       136272  2   Worker Thread   <No Name>       Highest
Unflagged       133060  7   Worker Thread   vshost.RunParkingWindow [Managed to Native Transition]  Normal
Unflagged       136952  10  Main Thread Main Thread [edited].Program.Main   Normal
Unflagged       134544  9   Worker Thread   .NET SystemEvents   [Managed to Native Transition]  Normal
Unflagged       136556  11  Worker Thread   Worker Thread   [edited].MessageService.ProcessJobs.AnonymousMethod__0  Normal
Unflagged       141364  113 Worker Thread   <No Name>   [In a sleep, wait, or join] Normal
Unflagged       140896  0   Worker Thread   [Thread Destroyed]      Normal
Unflagged       136776  19  Worker Thread   <No Name>   [In a sleep, wait, or join] Normal
Unflagged       135704  20  Worker Thread   <No Name>   [In a sleep, wait, or join] Normal
Unflagged       136712  21  Worker Thread   <No Name>   [In a sleep, wait, or join] Normal
Unflagged       134984  22  Worker Thread   <No Name>   [In a sleep, wait, or join] Normal
Unflagged       134660  23  Worker Thread   Worker Thread   [edited].BroadcastService.ProcessJobs.AnonymousMethod__1d   Normal
Unflagged       140224  152 Worker Thread   <No Name>       Normal
Unflagged       140792  157 Worker Thread   <No Name>       Normal
Unflagged       137116  0   Worker Thread   <No Name>       Normal
Unflagged       140776  111 Worker Thread   <No Name>       Normal
Unflagged       140784  0   Worker Thread   [Thread Destroyed]      Normal
Unflagged       140068  145 Worker Thread   <No Name>       Normal
Unflagged       139000  150 Worker Thread   <No Name>       Normal
Unflagged       140828  52  Worker Thread   <No Name>       Normal
Unflagged       137752  146 Worker Thread   <No Name>       Normal
Unflagged       140868  151 Worker Thread   <No Name>       Normal
Unflagged       141324  139 Worker Thread   <No Name>       Normal
Unflagged       140168  154 Worker Thread   <No Name>       Normal
Unflagged       141848  0   Worker Thread   [Thread Destroyed]      Normal
Unflagged       135544  153 Worker Thread   <No Name>       Normal
Unflagged       142260  140 Worker Thread   <No Name>       Normal
Unflagged       141528  142 Worker Thread   <No Name>   [In a sleep, wait, or join] Normal
Unflagged       141344  0   Worker Thread   [Thread Destroyed]      Normal
Unflagged       140096  136 Worker Thread   <No Name>       Normal
Unflagged       141712  134 Worker Thread   <No Name>       Normal
Unflagged       141688  147 Worker Thread   <No Name>       Normal
Run Code Online (Sandbox Code Playgroud)

更新: 我已经将罪魁祸首追溯到System.Timers.Timer.即使这个计时器在每个Elapsed事件上调用一个空方法,它仍然无限地提高了逻辑线程数.只需将计时器更改为DispatcherTimer即可解决问题.

!dumpheap -type TimerCallback这个问题中提到的Windbg中运行后看到大量的数据后,我开始查看应用程序中的所有计时器.

我仍然想知道我怎么能通过Windbg调试检测到这个,而不是禁用定时器/检查性能/重复方法,这导致我修复.即任何可以告诉我哪个计时器正在创建问题的东西.

Han*_*ant 4

这通常是由于线程池线程卡住且未完成而导致的。每半秒,线程池管理器就会允许另一个线程开始尝试处理积压的工作。这种情况一直持续下去,直到达到 ThreadPool.SetMaxThreads() 设置的最大线程数。默认情况下,一个巨大的数字,在 4 核机器上为 1000。

使用 Debug + Windows + Threads 查看正在运行的线程。他们的调用堆栈应该清楚地表明他们阻塞的原因。