dangerousThreadingAPI MDA
注意
本文專屬於 .NET Framework。 它不適用於較新的 .NET 實作,包括 .NET 6 和更新版本。
在目前執行緒以外的執行緒上呼叫 Thread.Suspend 方法時,會啟用 dangerousThreadingAPI
Managed 偵錯助理 (MDA)。
徵兆
應用程式沒有回應。 系統或應用程式資料可能會暫時處於無法預測的狀態,或甚至已關閉應用程式。 某些作業未如預期完成。
由於這個問題原有的隨機性,徵兆可能會有很大的不同。
原因
使用 Suspend 方法,將執行緒非同步取代為另一個執行緒。 沒有任何方法可判斷執行緒何時可以安全地暫止另一個執行緒,而後者可能正在進行。 暫止執行緒可能會導致資料損毀或非變異值中斷。 如果線程處於暫停狀態,且永遠不會使用 Resume 方法繼續,應用程式可能會停止回應,而且可能會損毀應用程式數據。 這些方法已標記為過時。
如果目標執行緒擁有同步處理原始物件,則在暫止期間仍會擁有它們。 如果另一個執行緒 (例如執行 Suspend 的執行緒) 嘗試取得原始物件的鎖定,則這可能會導致死結。 在此情況下,問題資訊清單本身會是死結。
解決方法
請避免需要使用 Suspend 和 Resume 的設計。 針對線程之間的合作,請使用同步處理基本類型,例如 Lock、 Monitor、 ReaderWriterLock、 Mutex或 C# lock
語句。 如果您必須使用這些方法,請減少時間範圍,並將執行緒處於暫止狀態時執行的程式碼數量降至最低。
對執行階段的影響
此 MDA 對 CLR 沒有影響。 它只會報告危險執行緒處理作業的資料。
輸出
MDA 識別可啟用它的危險執行緒處理方法。
組態
<mdaConfig>
<assistants>
<dangerousThreadingAPI />
</assistants>
</mdaConfig>
範例
下列程式碼範例示範如何呼叫 Suspend 方法,以啟用 dangerousThreadingAPI
。
using System.Threading;
void FireMda()
{
Thread t = new Thread(delegate() { Thread.Sleep(1000); });
t.Start();
// The following line activates the MDA.
t.Suspend();
t.Resume();
t.Join();
}