我正在使用重定向的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