Note
本文專指 .NET 框架。 此規定不適用於較新的 .NET 實作,包括 .NET 6 及更新版本。
contextSwitchDeadlock當嘗試進行 COM 上下文轉換時偵測到死結,管理除錯助理(MDA)會被啟動。
Symptoms
最常見的症狀是,從受管程式碼呼叫非受管 COM 元件時,無法回傳。 另一個症狀是記憶體使用量隨時間增加。
原因
最可能的原因是單執行緒公寓(STA)執行緒沒有發送訊息。 STA 執行緒要麼在未發送訊息的情況下等待,要麼正在執行冗長的操作,導致訊息佇列無法被抽取。
記憶體使用量隨時間增加,是因為終結執行緒嘗試呼叫 Release 未受管理的 COM 元件,但該元件未回傳。 這會防止終結者收回其他物件。
預設情況下,Visual Basic 主控台應用程式的主執行緒執行緒模型是 STA。 當 STA 執行緒透過公共語言執行時或第三方控制直接或間接使用 COM 互通性時,該 MDA 會被啟動。 為了避免在 Visual Basic 主控台應用程式中啟動此 MDA,請將該MTAThreadAttribute屬性套用到主方法,或將應用程式修改為 pump 訊息。
當滿足以下所有條件時,此 MDA 有可能被誤激活:
應用程式可直接或間接透過函式庫從 STA 執行緒建立 COM 元件。
應用程式在除錯器中停止,使用者則繼續執行或執行步進操作。
未啟用非管理除錯。
要判斷 MDA 是否被誤啟,請停用所有中斷點,重新啟動應用程式,並允許其不停止地執行。 如果MDA未被激活,則很可能最初的活化是假的。 此時,請停用 MDA,以避免干擾除錯會話。
Note
這個 MDA 是 Visual Studio 預設的設定。 關於如何停用 MDA 的資訊,請參閱 「使用受管除錯助理診斷錯誤」。
解決方法
請遵守 COM 關於 STA 訊息流傳的規則。
對運行時間的影響
此 MDA 對 CLR 沒有影響。 它只報告關於 COM 情境的資料。
Output
一則描述當前上下文與目標上下文的訊息。
Configuration
<mdaConfig>
<assistants>
<contextSwitchDeadlock />
</assistants>
</mdaConfig>