1. 程式人生 > >C# "資源管理器已停止工作"的程式設計解決方案

C# "資源管理器已停止工作"的程式設計解決方案

如果你使用的是win7+的系統,那麼你很可能遇到過下面的提示框:

資源管理器已停止工作

導致資源管理器崩潰的原因有很多:
1. 第三方軟體衝突,包括中毒軟體不相容等情況
2. 系統本身缺陷,包括缺少必要檔案,設定錯誤或登錄檔異常等情況
3. 其他

百度有很多的解決方案,不過還是要具體情況具體分析,查詢根源。這裡就不詳述了。

如果你在測試你自己的程式的時候遇到這種情況,並且是確定性的,那很可能就是程式本身存在問題,需要除錯排查,比如使用日誌記錄等來跟蹤崩潰點。

如果你的程式是要長時間執行的,並且偶爾才會遇到這種情況,排查也沒有找到可疑的問題,那麼或許一個臨時的方案就是,如何讓你的程式自動從 資源管理器已停止工作中恢復,這也是今天這裡將要提到的解決方案。

我們的思路很簡單:當出現崩潰的時候我們桌面上肯定是有這樣一個視窗存在,並且其視窗標題是固定的“Windows 資源管理器”,這時,使用者介面是停止了互動功能,但如果我們的程式還能夠列舉視窗來找到這個視窗,就是我們的程式可以檢測到這個情況,那就可以去顯式的重啟explorer.exe程序,來從這種情況中恢復回來。測試後你會看到,答案是肯定的。不過如果你在程式中結束掉explorer.exe這個程序,一般並不需要你再顯式的去重啟這個程序,它會自動重啟。
那麼程式碼就簡單了:

var handle = Utility.FindWindow("windows 資源管理器");
if(handle != IntPtr.Zero)
{
    RestartExplorer();
    Utility.CloseWindow(handle);
}

public
static void RestartExplorer() { Process[] processes; processes = Process.GetProcessesByName("explorer"); foreach (var p in processes) { p.Kill(); } //wait auto start System.Threading.Thread.Sleep(2000); //ensure start
processes = Process.GetProcessesByName("explorer"); if (processes.Count() == 0) { Process.Start("explorer.exe"); } }