2011-12-19 45 views
1

程序的代碼如下所示:C#的Process.Start()無法處理線程資源

using System.Diagnostics; 

class Test 
{ 
    static void Main() 
    { 
     using (Process p = Process.Start("notepad.exe")) 
     { 
     } 
    } 
} 

問題是,當該程序已經被關閉,記事本仍在運行,記事本將其鎖定。我不想關閉記事本。
我試着用Unlocker來檢測問題。
結果截屏是象下面這樣:

Result Image Link

所以我想在開始的exe文件,並立即處理所有線程的資源。或者,我不能卸載我的程序,直到它打開的所有程序都關閉。這可能會導致不愉快的用戶體驗。要求系統重啓也是令人不快的。解鎖器可以很好地完成它。如果我使用Unlocker解鎖父文件夾,它不會關閉記事本,然後我可以正常刪除該程序文件。

+4

爲什麼你叫'Dispose'在用'using'語句包裝的對象上? – 2011-12-19 10:29:30

+1

鎖什麼?你想做什麼? – Shai 2011-12-19 10:29:42

+1

首先,using語句本身會在其出口處調用dispose。 其次你可能想使用'WaitForExit'。 – Rolice 2011-12-19 10:50:11

回答

1

的問題是,你永遠不接近正在運行的進程,因此它會繼續運行,這將導致解鎖,以表明它已被鎖定。

我知道你認爲你做,因爲你叫p.Close(),但訣竅是,Process.Close() method原因關閉該程序。它不會將WM_CLOSEWM_QUIT消息發送到記事本窗口。它所做的只是釋放與流程相關的資源。

取而代之,您需要使用Process.CloseMainWindow() method。這會發送窗口WM_CLOSE消息,導致它正常關閉。

所以更新的代碼看起來像這樣(如別人所說,沒有必要以顯式調用Dispose如果你已經包裹在一個using語句創建對象):

using System.Diagnostics; 

class Test 
{ 
    static void Main() 
    { 
     using (Process p = Process.Start("notepad.exe")) 
     { 
      p.CloseMainWindow(); 
      p.Close(); 
     } 
    } 
} 

請注意,您可能使用Process.Kill() method,但這就像通過將電源線從牆上拔出來關閉計算機一樣。與其要求應用程序很好地關閉,它強制終止它,就像在任務管理器中單擊「結束任務」一樣。因此,只有當流程被鎖定或者沒有對禮貌請求關閉時才應使用它。


另外,正如Rolice在評論中提到的,上面的代碼不會很有用。你只是開始記事本,然後立即關閉它。

相反,您可能想要啓動該過程,允許用戶與其交互,然後在完成後清理。

在這種情況下,您需要使用Process.WaitForExit()方法。此方法將阻止調用線程,無限期地等待進程退出。當用戶最後關閉記事本時,控制將返回到您的應用程序的線程,您可以撥打p.Close()

例如:

using System.Diagnostics; 

class Test 
{ 
    static void Main() 
    { 
     using (Process p = Process.Start("notepad.exe")) 
     { 
      p.WaitForExit(); 
      p.Close(); 
     } 
    } 
} 
+0

謝謝。問題來自自我更新promgram。我想刪除可能會打開其他程序的程序文件。 – 2011-12-19 12:04:09

-4

儘量只在啓動過程中沒有得到參考吧:

Process.Start("notepad.exe"); 
+2

這個回答是錯誤的和有害的。沒有確定的破壞。 – GSerg 2011-12-19 10:42:39

+0

你讀過這個問題了嗎? – 2011-12-19 11:09:42

0

這裏有

  1. 兩種可能的解決方案在應用程序中,等待過程中,你退出你的應用程序之前退出。有severalways這樣做。
  2. 當您的應用程序退出時終止該過程。 nicelyby force後者不是很好,如果用戶正在編輯某些內容,可能會導致數據丟失。

在情況#1以上,你可以彈出一個對話框或東西給用戶,告知您正在等待記事本退出(或許還有一個按鈕,將其殺死)