我有一个应用程序
Process.Start()
我想启动另一个名为'ABC'的应用程序。 我希望等待该应用程序结束(进程死亡)后再继续执行。 我应该如何做?
可能会同时运行多个名为'ABC'的应用程序实例。
我认为你只是想要这个:
var process = Process.Start(...);
process.WaitForExit();
请查看MSDN页面,此页面涉及该方法。此外,它还有一个超载函数,您可以在其中指定超时时间,以免可能一直等待。
想要阻塞进程直到其退出,可以使用Process.WaitForExit
方法。如果不想阻塞,则可以订阅Process.Exited
事件?如果这些方法无法满足您的需求,请提供更多信息。
Process.Exited
事件,我认为你必须事先配置进程,通过将Process.EnableRaisingEvents
设置为true。尽管考虑到这个问题已经超过三年了,可能在提问时Process.EnableRaisingEvents
还不存在。 - WillProcess.EnableRaisingEvents
会抛出Win32Exception
(访问被拒绝),并且HasExited
也会引发相同的异常。 (至少在.NET Framework 4.8中仍然如此。) - skst我在我的应用程序中执行以下操作:
Process process = new Process();
process.StartInfo.FileName = executable;
process.StartInfo.Arguments = arguments;
process.StartInfo.ErrorDialog = true;
process.StartInfo.WindowStyle = ProcessWindowStyle.Minimized;
process.Start();
process.WaitForExit(1000 * 60 * 5); // Wait up to five minutes.
这里有一些额外的功能,你可能会发现它们有用...
您可以使用等待退出或者捕获HasExited属性并更新您的UI以保持用户"知情"(期望管理):
System.Diagnostics.Process process = System.Diagnostics.Process.Start("cmd.exe");
while (!process.HasExited)
{
//update UI
}
//done
我曾遇到这样一种情况,即在关闭属于进程的窗口后,Process.HasExited
没有发生变化。因此,Process.WaitForExit()
也没有起作用。我不得不监控 Process.Responding
,而在关闭窗口后它变为 false,像这样:
while (!_process.HasExited && _process.Responding) {
Thread.Sleep(100);
}
...
也许这能帮到某个人。
参考微软的示例:
[https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.process.enableraisingevents?view=netframework-4.8]最好的方法是设置:
myProcess.EnableRaisingEvents = true;
// Start a process and raise an event when done.
myProcess.StartInfo.FileName = fileName;
// Allows to raise event when the process is finished
myProcess.EnableRaisingEvents = true;
// Eventhandler wich fires when exited
myProcess.Exited += new EventHandler(myProcess_Exited);
// Starts the process
myProcess.Start();
// Handle Exited event and display process information.
private void myProcess_Exited(object sender, System.EventArgs e)
{
Console.WriteLine(
$"Exit time : {myProcess.ExitTime}\n" +
$"Exit code : {myProcess.ExitCode}\n" +
$"Elapsed time : {elapsedTime}");
}
就像Jon Skeet所说的那样,使用Process.Exited
:
proc.StartInfo.FileName = exportPath + @"\" + fileExe;
proc.Exited += new EventHandler(myProcess_Exited);
proc.Start();
inProcess = true;
while (inProcess)
{
proc.Refresh();
System.Threading.Thread.Sleep(10);
if (proc.HasExited)
{
inProcess = false;
}
}
private void myProcess_Exited(object sender, System.EventArgs e)
{
inProcess = false;
Console.WriteLine("Exit time: {0}\r\n" +
"Exit code: {1}\r\n", proc.ExitTime, proc.ExitCode);
}
试试这个:
string command = "...";
var process = Process.Start(command);
process.WaitForExit();