在以下示例中,如果代碼在離開using語句後仍在運行,會發生什麼情況?沒有WaitForExit()的using語句中的Process會發生什麼?
using (var p = new Process())
{
p.StartInfo.FileName = "c:\\temp\\SomeConsoleApp.exe";
p.Start();
}
在以下示例中,如果代碼在離開using語句後仍在運行,會發生什麼情況?沒有WaitForExit()的using語句中的Process會發生什麼?
using (var p = new Process())
{
p.StartInfo.FileName = "c:\\temp\\SomeConsoleApp.exe";
p.Start();
}
每個人都應該分開適合你的系統上從Process
對象中運行的操作系統的過程,代表一個在你的程序「處理」給它:
Process
對象被丟棄,因此您的程序不能再與OS進程交互。調用Dispose()
方法對Process
對象不殺死OS進程。
進程將運行util關閉它。它不會因爲進程的對象範圍結束而死亡。
如您所知,using
聲明會調用Dispose
方法,所以流程實例將被Disposed。
要與流程交互,獲取您需要的流程相關信息Handle
to the Process。 .Net框架內部持有句柄,並承擔所有的痛苦。配置將關閉進程Handle
,因此您將無法再使用Process
對象。
而且最重要的是:你開始的過程沒有任何反應,它運行起來就好像沒有任何反應。真的什麼都沒有發生,你剛剛失去了門的關鍵,並不意味着房間被摧毀。
進程將繼續運行。您可以將進程p移動到類成員,並停止OnStop中的進程,以確保您可以在exe發生故障時再次停止服務。
protected override void OnStop()
{
p.Kill();
}
範圍無關這個問題 – 2014-12-04 18:06:36
@SriramSakthivel OP採用了'using',所以他期待的過程,如果對象超出範圍就不行了。 – 2014-12-04 18:07:36
是的,他用'使用'與範圍有關嗎? – 2014-12-04 18:08:25