程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C# Process.Kill() 拒絕訪問(Access Denied) 的解決方案

C# Process.Kill() 拒絕訪問(Access Denied) 的解決方案

編輯:C#入門知識

C# Process.Kill() 拒絕訪問(Access Denied) 的解決方案


需求:很多時候我們需要後台運行幾個Console來不停的計算數據,那麼部署到客戶服務器後,如果出現突發異常,程序掛掉了,那。。。?       解決方案:封裝了一個對後台運行程序不停監測的功能,如果發現程序有異常,但是進程還在,這個時候就Kill掉這個進程,重啟後台計算程序,這裡的計算程序均為"控制台運行程序"。       代碼如下:        if (進程是否掛掉)                 {                     // 獲取所有進程                     Process[] ps = Process.GetProcesses();                     for (int i = 0; i < ps.Length; i++)                     {                         if (ps[i].ProcessName.StartsWith(“ProcessName"))                         {                             // 統計崩潰計數                             CrashCount(obj.Name);                             ps[i].Kill();                         }                     }                     Process.Start(Path);                     Console.WriteLine(ProcessName + "程序已重啟!");                 }               異常中可以看到,Kill()進程的時候出現"拒絕訪問",在網上搜了下,解決方案大致就這幾種:   在config裡增加identity <system.web>   <identity impersonate="true" userName="Administrator" password="123456" /> </system.web>  檢測程序用"管理員身份運行" 對監測的程序目錄分配權限 結果是這幾種方式都沒能解決此問題。       我查看了Kill()方法的注釋:      //         // 摘要:          //     立即停止關聯的進程。         //         // 異常:          //   System.ComponentModel.Win32Exception:         //     未能終止關聯的進程。 - 或 - 正在終止該進程。 - 或 - 關聯的進程是一個 Win16 可執行文件。         //         //   System.NotSupportedException:         //     您正嘗試為遠程計算機上運行的進程調用 System.Diagnostics.Process.Kill()。 該方法僅對在本地計算機上運行的進程可用。         //         //   System.InvalidOperationException:         //     該進程已經退出。 - 或 - 沒有與此 System.Diagnostics.Process 對象關聯的進程。         public void Kill();   發現是一個Win32Exception的異常,隨後我又查閱了ms的官方文檔,果然有發現:   大概意思就是說如果這個監測程序是Console,這樣寫是沒問題的,可以正常結束掉進程。但這裡因為需要在界面上展現出一些監測數據,這裡我用的是WPF,也就是文檔裡說的圖像界面程序。   MS的原話是這樣的:如果調用 Kill,則可能丟失進程編輯的數據或分配給進程的資源。Kill 導致進程不正常終止,因而只應在必要時使用。CloseMainWindow 使進程能夠有序終止並關閉所有窗口,所以對於有界面的應用程序,使用它更好。如果 CloseMainWindow 失敗,則可以使用 Kill終止進程。Kill 是終止沒有圖形化界面的進程的唯一方法。   將Kill方法()改成了CloseMainWindow()即可正常殺掉進程。   以上就是這兩天碰到的一個異常,讓我總結出了一個新的結論,在遇到問題的時候,不要盲目的去google或百度,應該首先去查閱ms的官方文檔。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved