的問題是,你永遠不接近正在運行的進程,因此它會繼續運行,這將導致解鎖,以表明它已被鎖定。
我知道你認爲你做,因爲你叫p.Close()
,但訣竅是,Process.Close()
method不不原因關閉該程序。它不會將WM_CLOSE
或WM_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();
}
}
}
爲什麼你叫'Dispose'在用'using'語句包裝的對象上? – 2011-12-19 10:29:30
鎖什麼?你想做什麼? – Shai 2011-12-19 10:29:42
首先,using語句本身會在其出口處調用dispose。 其次你可能想使用'WaitForExit'。 – Rolice 2011-12-19 10:50:11