等到过程结束

时间:2010-06-30 09:18:44

标签: c# .net process

我有一个

的应用程序
Process.Start()

启动另一个应用程序'ABC'。我想等到应用程序结束(进程死机)并继续执行。我该怎么办?

应用程序“ABC”可能有多个实例同时运行。

9 个答案:

答案 0 :(得分:366)

我想你只想要这个:

var process = Process.Start(...);
process.WaitForExit();

有关方法,请参阅MSDN page。它也有一个过载,你可以指定超时,所以你不可能永远等待。

答案 1 :(得分:127)

使用Process.WaitForExit?或者,如果您不想阻止,请订阅Process.Exited事件?如果这不符合您的要求,请向我们提供有关您的要求的更多信息。

答案 2 :(得分:34)

我在申请中执行以下操作:

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.

在那里你可能会发现一些有用的额外功能......

答案 3 :(得分:16)

您可以使用wait for exit或者您可以捕获HasExited属性并更新您的UI以保持用户“通知”(期望管理):

System.Diagnostics.Process process = System.Diagnostics.Process.Start("cmd.exe");
while (!process.HasExited)
{
    //update UI
}
//done

答案 4 :(得分:8)

我有一个案例,在关闭属于该进程的窗口后Process.HasExited没有改变。所以Process.WaitForExit()也没有用。关闭窗口之后,我必须监视Process.Responding这样的错误:

while (!_process.HasExited && _process.Responding) {
  Thread.Sleep(100);
}
...

也许这有助于某人。

答案 5 :(得分:6)

Process.WaitForExit应该是我想要的。

答案 6 :(得分:1)

请参考Microsoft的示例: [https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.process.enableraisingevents?view=netframework-4.8]

最好是设置:

// 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}");
}

否则该代码将被阻止。 另外,不需要其他属性。

  private var enteredText: String = ""

  func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    if enteredText.count > 0 && string == "" && range.length == 1 {
        //Handles backspace
        enteredText.removeLast()
    }
    else {
        enteredText += string
    }
    return true
  }


func textFieldDidChangeCharacter(textField:UITextField) {
    if let number = NumberFormatter().number(from: enteredText) {
        let double = number.doubleValue/100.0
        let string = String(format: "%0.2f", double)
        textField.text = string
    }
}

答案 7 :(得分:0)

如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);
}

答案 8 :(得分:-5)

试试这个:

string command = "...";
var process = Process.Start(command);
process.WaitForExit();