启动进程并等待退出代码而不冻结

Posted

技术标签:

【中文标题】启动进程并等待退出代码而不冻结【英文标题】:Start Process and wait for Exit code without freezing 【发布时间】:2014-03-23 07:32:36 【问题描述】:

我正在尝试将我曾经在 NSIS 中制作的程序移植到 C# Winforms,我遇到了一个问题,当我调用进程 adb.exe 时,整个程序锁定然后在几秒钟后将最终输出扔给我。

我意识到这可能已经被问过很多次了,但即使经过大量的谷歌搜索,我自己仍然找不到解决方案(而且我是使用 WinForms 的新手)。以下是我的代码:

public static int runAdb(string args, out string output)

    bAdbRunning = true;

    adbProc.StartInfo.Arguments = args;
    adbProc.Exited += new EventHandler(adbExitHandler);
    adbProc.Start();

    // Read all output into string output
    output = adbProc.StandardOutput.ReadToEnd();

    while (bAdbRunning)
    
        System.Threading.Thread.Sleep(100);
    

    return adbProc.ExitCode;


private static void adbExitHandler(object sender, EventArgs args)

    bAdbRunning = false;

这是调用它的代码:

public static void BaseOperations(Label outputWindow, ProgressBar operationsBar, int opIndex)

    // Run server
    if (opIndex == 0)
    
        outputLine(outputWindow, "Shutting down existing adb server");
        runAdb("kill-server", out outText);
        operationsBar.Value += 1; // 1%

        outputLine(outputWindow, "Restarting adb server...");
        runAdb("start-server", out outText);
        operationsBar.Value += 1; // 2%;
    

【问题讨论】:

我认为您可以通过收听进程的Exited事件来实现这一点。 Process.WaitForExit 方法将阻塞调用线程,直到相关进程退出。在这种情况下,您会阻塞主线程并因此导致 UI 冻结。使用 Sudhakar 所述的Exited 事件。 【参考方案1】:

您需要订阅 Process Exited 事件才能实现此目的。

试试这个:

public static int runAdb(string args, out string output)

    adbProc.StartInfo.Arguments = args;
    adbProc.Exited += new EventHandler(ProcessExitHandler);
    adbProc.Start();

    // Read all output into string output
    output = adbProc.StandardOutput.ReadToEnd();        


private void ProcessExitHandler(object sender,EventArgs args)


//Your process exited and now do whatever you want.


【讨论】:

感谢您的回复。我不确定我是否做错了什么,但我已经尝试过你提到的,希望它会起作用,但它似乎并没有这样做。 Start-Server 需要一些时间才能工作,在此期间,我的 GUI 就像以前一样被锁定。我已经更新了上面的代码以反映更改

以上是关于启动进程并等待退出代码而不冻结的主要内容,如果未能解决你的问题,请参考以下文章

WaitForMultipleObjects 不等待

python 怎么启动一个外部命令程序,并且不阻塞当前进程

在VB6中等待进程退出后恢复窗口

想退出主进程而不等待process2返回

非阻塞等待子进程退出

获取前一段时间完成的后台进程的退出代码