Ctrl+Alt+Break 中斷執行 → 偵錯 → 視窗 → 執行緒 → 逐一切換執行緒查看呼叫堆疊,找到卡住的執行緒位置。Debug.WriteLine 或 log4net,觀察最後一條輸出位置。WinDbg / Visual Studio 開啟 .dmp,指令 !clrstack 查看托管堆疊。| 原因 | 徵兆 | 對策 |
|---|---|---|
| UI 執行緒同步等待 | .Result / .Wait() / Task.Run(...).Result | 全面改 async/await,避免同步阻塞 |
| 死鎖 | 多執行緒互相等待 lock | 統一鎖順序、使用 Concurrent 集合、縮小臨界區 |
| 大量運算未分頁 | CPU 100%、UI 凍結 | BackgroundWorker / Task.Run 分批、報告進度 |
| 非托管資源洩漏 | 記憶體持增、最終 OOM | IDisposable 模式、SafeHandle、定期 GC.Collect 觀察 |
| 例外被吞沒 | 無提示直接退出 | AppDomain.CurrentDomain.UnhandledException 統一記錄 |
IO、網路、計算) 必須放入背景執行緒。Invoke/BeginInvoke (WinForms) 或 Dispatcher.Invoke (WPF)。Debug → Options → Enable Just My Code 取消勾選,以便進入框架原始碼除錯。.pdb 符號檔,便於 Dump 分析定位原始碼行號。