4

我已经开始了一个过程:

Dim getUdpate as Process
getUpdate = New Process
getUpdate.StartInfo.FileName = "C:\UTIL\GETBTCH.BAT"
getUpdate.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
getUpdate.StartInfo.UseShellExecute = False
getUpdate.StartInfo.WorkingDirectory = "C:\UTIL\"
getUpdate.Start()
getUpdate.Close()

然后,我想运行另一个进程,但我想先检查该getUpdate进程是否已经完成。

如何检查该过程是否已经完成?

我已经尝试查看进程 ID,但它只显示 cmd.exe 并且有很多 cmd.exe 作为进程 ID,所以我不能只是去停止所有这些。

4

3 回答 3

6

您可以检查进程的HasExited属性。如果进程已经结束,它将返回 true,如果它仍在运行,则返回 false。

在调用Process 对象之前,Close()您需要检查这一点。getUpdate因此getProcess必须保持打开状态,直到进程退出。

于 2013-08-12T02:20:02.057 回答
2

尝试:

getUpdate.WaitForExit();代替

getUpdate.Close()

于 2013-08-12T02:07:53.637 回答
1

如果您正在制作 WinForms 应用程序或类似的交互式 UI,我建议将函数挂钩到对象的Exited事件中,而不是 polling HasExited

(您可能已经知道这一点,但是)如果您使用WaitForExit或轮询HasExited您的 UI 正是因为您的代码实际上正在等待进程结束而挂起。

您的 UI 只有一个线程,不能“多任务”。这就是为什么这些“处理”类型的动作应该在不同的线程中完成(或者,就像这里的情况一样,不同的进程),并在完成时向 UI 报告。

例子:

' Handle Exited event and display process information.
Private Sub myProcess_Exited(ByVal sender As Object, ByVal e As System.EventArgs)
    'Do something in your UI
End Sub

并在您的起始代码中:

getUpdate.EnableRaisingEvents = True
AddHandler getUpdate.Exited, AddressOf myProcess_Exited
于 2014-07-09T10:02:39.080 回答