我正在使用重定向的I/O與模擬器可執行文件進行通信,從VB.NET GUI控制一箇舊的FORTRAN模擬器。 GUI彈出一個帶有進度條,估計時間和「停止」按鈕的「狀態」窗口(Button_Stop
)。.NET Process.Kill()以安全的方式
現在,我想Button_Stop
立即終止仿真程序。執行此操作的顯而易見的方法是在Child
Process對象上調用Kill()
。如果在進程退出後這樣做會發出異常,但是我可以在嘗試終止進程之前測試該進程是否已退出,對不對?
OK,所以我做的是單擊按鈕時以下幾點:
If Not Child.HasExited Then
Child.Kill()
Button_Stop.Enabled = False
End If
但是,如果過程發生的測試和調用Kill()
之間退出呢?在那種情況下,我得到一個例外。
發生在我接下來的事情是,我可以在Process.Exited
事件處理程序做Button_Stop.Enabled = False
,從而防止Button_Stop.Clicked
處理程序Child.Kill()
電話。但由於Process.Exited
處理程序被調用在不同的線程中,仍有以下可能的交織:
- 子進程退出。
Process.Exited
火災,呼籲Invoke
安排上Button_Stop
的Button_Stop.Enabled = False
- 用戶點擊,引發
Child.Kill()
Button_Stop.Enabled = False
實際情況。
一個例外然後一步拋出3.
如何殺過程中沒有任何競爭條件?我在想這個完全錯誤嗎?
這將工作,但它似乎很尷尬,因爲它s意味着在地板上拋出異常。構建在正常操作中永遠不會遇到異常的程序不是很好的做法嗎? – 2010-05-05 21:40:48
@Orbode:你可能看起來很尷尬,但是這樣的外部異常應該使用try-catch塊來處理。進一步閱讀:http://blogs.msdn.com/ericlippert/archive/2008/09/10/vexing-exceptions.aspx – 2010-05-05 21:42:18
@Orborde這只是推薦的事情,如果你捕捉.NET異常。在這種情況下,您正在捕獲非託管的異常,因此可以捕獲所有內容 – 2010-05-05 21:47:57