簡體   English   中英

應用程序中短期線程的起源

[英]Origin of short-lived threads in an application

我目前正在對一個應用程序進行健康檢查,該應用程序在大量使用期間會出現 UI 卡頓現象。

使用適用於 Visual Studio 2015 的Microsoft Concurrency Visualizer擴展,表明在大約 100 毫秒的執行后創建並停止了相當多的短期線程。 不幸的是,他們顯示的調用堆棧就像clr.dll!0x98071 ntdll.dll!0x634fb ,我不太確定如何從中提取有用的信息。

我不知道這些線程的目的是什么,以及應用程序中的哪一部分代碼正在創建它們。

我怎樣才能更好地確定他們每個人的起點?

在代碼中,我能夠 grep 一些任務,另一個 QueueUserWorkItems,幾十個普通線程實例,一些 System.Threading.Timer 和 System.Timers.Timer,沒有反應式擴展。 我為所有這些設置了斷點,但似乎我錯過了一些......

我不認為那些來自線程池,因為它們會在並發可視化器中以同步狀態顯示,相反,它們只是結束,稍后會創建另一個具有另一個 Id 的對象。 但也許我在誤導。

我們還使用了一些第三方庫和一堆 JuggerNET 生成的代碼,所以可能起源甚至不在應用程序本身中。

通過仔細查看一些神秘的調用堆棧,我終於能夠找到這些短期線程的罪魁禍首,例如:

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

這讓我想到我應該仔細檢查聲音警報系統。 正是這個線程催生了這些線程。

筆記:

但是,我不會接受我的答案,因為我希望有人分享更好的過程或任何診斷不需要的線程來源的提示和技巧。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM