如何在WPF应用程序中等待控制台进程完成后再运行其他控制台进程?

4
我有两个外部进程需要运行(2个控制台exe),它们将输出到控制台。我在wpf应用程序上运行这些应用程序。我捕获控制台输出并将其用作输入。
这是我的步骤: 1. 运行第一个进程。捕获控制台输出。 2. 使用第一个进程的输出进行一些工作。 3. 在我有了一些工作输出后运行第二个进程。
问题是,在运行另一个进程之前,我必须等待其他进程完成并使用其输出。当我想要运行第二个进程时,第一个进程还没有完成。
public MainWindow()
{
    InitializeComponent();
    ExtProcess1();
    ExtProcess2();  //this is executed before ExtProcess1 OutputDataReceived is completely captured
    Instance = this;
}

public static void ExtProcess1()
{
    Process process = new Process();
    process.EnableRaisingEvents = true;
    process.OutputDataReceived += new DataReceivedEventHandler(process_OutputDataReceived);
    process.Exited += new EventHandler(process_Exited);
    process.StartInfo.FileName = "test.exe";
    process.StartInfo.UseShellExecute = false;
    process.StartInfo.RedirectStandardOutput = true;
    process.StartInfo.CreateNoWindow = true;
    process.Start();
    process.PriorityClass = ProcessPriorityClass.RealTime;
    process.BeginOutputReadLine();
    process.WaitForExit();
}

static void process_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
    if (MainWindow.Instance.lbLog.Dispatcher.Thread == Thread.CurrentThread)
    {
        String s = (String)e.Data;
        MainWindow.Instance.lbLog.Items.Add(s);
    }
    else
    {
        MainWindow.Instance.lbLog.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Send,
            new EventHandler<DataReceivedEventArgs>(corePingPid_OutputDataReceived), sender, new object[] { e });
    }
}

如何强制WPF应用在运行第二个进程之前等待第一个进程完成?
1个回答

3
假设您正在使用Process类来执行并捕获控制台输出,您可以使用Process.WaitForExit方法。它将阻塞当前线程,直到进程完成执行。还有另一个重载,它可以阻塞当前线程,直到进程完成或经过指定的超时时间。

这也是我使用的。只要小心使用,因为如果您尝试在GUI线程上运行它,它会锁定您的GUI线程。 - jocull
我使用了 process.waitforexit()。我还使用了 process.outputdatareceived,这是我捕获控制台输出的地方。 - Syaiful Nizam Yahya
如何实现这个功能。process.Start(); process.BeginOutputReadLine(); process.StandardOutput.ReadToEnd(); process.WaitForExit(); 同时使用BeginOutputReadLine和ReadToEnd会导致错误,指出无法同时进行同步和异步操作。如果删除BeginOutputReadLine,则永远不会输出任何内容。请帮忙解决。谢谢。 - Syaiful Nizam Yahya
好的,现在我明白了如何使用ReadToEnd。问题是,添加WaitForExit将会阻塞当前线程并使我的UI无响应。我能异步读取标准输出并让线程等待直到读取标准输出完成吗?谢谢。 - Syaiful Nizam Yahya
如果我使用同步输出读取,能否实时显示结果? - Syaiful Nizam Yahya
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接