2016-06-28 179 views
0

我以前沒有使用過Windows DebugDiag的經驗,並且需要對此報告有所瞭解。.NET如何使用While循環保持線程運行

我的EWS託管API應用程序在發生事件時跨越一個新任務。

我的應用在〜30-35%的CPU使用率上運行,所以我決定運行這個診斷工具來找出wheres和whys。

我得到了這個,需要確保我看到的是正確的,我認爲它是正確的。

從下面的圖片可以看出,Task.StartNew函數執行了5次,導致了這麼高的CPU使用率?

更新

尋找更深層次後,我發現這似乎是「堆棧跟蹤」一些函數調用以紅色突出顯示,我有一種感覺紅色表示這些功能會導致高CPU,而這些功能的出現來自EWS託管API代碼。

Analysis Report

enter image description here

+1

調用堆棧的頂部是一個Exchange任務,同步數據。因此可以預期高CPU使用率,並在數據同步完成時結束。如果您知道如何使用ILSpy等工具,則可以反編譯相關方法以獲得更多見解。 –

回答

0

我發現CPU吃一段代碼。

我在Tast裏有一個無限的while循環,因爲我需要避免它被垃圾收集。

 While Not pToken.IsCancellationRequested 
      If pToken.IsCancellationRequested Then Return 
     End While 

這導致我的CPU使用率一直高達38%!

所以不是我用

 _CancelSignal = New AutoResetEvent(False) 

     _CancelSignal.WaitOne() 

爲了把線程睡眠,直到我告訴它退出通過設置_CancelSignsal

+1

要重新創建行爲,您應該使用'ManualResetEvent'。自動事件會在它讓一個事物通過後自動重置,一旦取消被請求,舊的代碼就會讓不止一件事通過 –