应用程序中短寿命线程的起源



我目前正在检查一个应用程序的运行状况,该应用程序在大量使用时会出现UI卡顿。

使用适用于Visual Studio 2015的Microsoft Concurrency Visualizer扩展显示,相当多的短命线程在执行约100毫秒后被创建并停止。不幸的是,他们显示的调用堆栈类似于clr.dll!0x98071ntdll.dll!0x634fb,我不太确定如何从中提取有用的信息。

我不知道这些线程的用途是什么,也不知道应用程序中的哪部分代码正在创建它们。

我如何才能更好地确定它们中的每一个是从哪里开始的

在代码中,我能够grep一些Tasks,另一个QueueUserWorkItems,几十个纯线程实例化,一些System.Threading.Timer&System.Timers.Timer,无响应扩展。我为所有这些设置了断点,但似乎我缺少了一些。。。

我不认为这些来自线程池,因为它们会在并发可视化工具中以同步状态显示,相反,它们只是结束,稍后会创建另一个具有另一个Id的线程池。但也许我有误导性。

我们还使用了一些第三方库和一堆JuggerNET生成的代码,所以可能源代码甚至不在应用程序本身。

通过仔细查看一些神秘的调用堆栈,我终于找到了那些短命线程的罪魁祸首,例如:

mmdevapi.dll
wdmaud.drv
avrt.dll
audioses.dll

这让我想到我应该仔细检查一下声音警报系统。事实上,正是这个产生了这些线索。

注意:

然而,我不会接受我的答案,因为我希望有人分享一个更好的过程或任何类型的提示和技巧来诊断不需要的线程来源。

最新更新