Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在wpf应用程序中运行另一个控制台进程之前,如何等待控制台进程完成?_C#_Wpf_Multithreading_User Interface_Process - Fatal编程技术网

C# 在wpf应用程序中运行另一个控制台进程之前,如何等待控制台进程完成?

C# 在wpf应用程序中运行另一个控制台进程之前,如何等待控制台进程完成?,c#,wpf,multithreading,user-interface,process,C#,Wpf,Multithreading,User Interface,Process,我有2个要运行的外部进程(2个控制台exe),它们向控制台提供输出。我正在wpf应用程序上运行这些应用程序。我捕获控制台输出并将其用作输入 我是怎么做的 1.运行第一个进程。捕获控制台输出。 2.使用第一个流程输出执行一些工作。 3.在我完成一些工作输出后运行第二个进程 我遇到的问题是,我必须等待另一个进程完成并使用其输出,然后才能运行另一个进程。当我想运行第二个进程时,第一个进程还没有完成 public MainWindow() { InitializeComponent();

我有2个要运行的外部进程(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 });
    }
}
public主窗口()
{
初始化组件();
ExtProcess1();
ExtProcess2();//这是在完全捕获ExtProcess1 OutputDataReceived之前执行的
实例=此;
}
公共静态void ExtProcess1()
{
流程=新流程();
process.EnableRaisingEvents=true;
process.OutputDataReceived+=新的DataReceiveDevenHandler(process\u OutputDataReceived);
process.Exited+=新的事件处理程序(process\u已退出);
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();
}
静态无效进程\u OutputDataReceived(对象发送方、DataReceivedEventArgs e)
{
if(MainWindow.Instance.lbLog.Dispatcher.Thread==Thread.CurrentThread)
{
字符串s=(字符串)e.Data;
MainWindow.Instance.lbLog.Items.Add;
}
其他的
{
MainWindow.Instance.lbLog.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Send,
新事件处理程序(corePingPid_OutputDataReceived)、发送方、新对象[]{e});
}
}

如何强制wpf应用程序在运行第二个进程之前等待第一个进程?

假设您使用process类来执行和捕获console的输出,则可以使用方法。它将阻塞当前线程,直到进程完成执行。还有另一个重载可以阻止当前线程,直到进程完成或指定的超时时间结束。

这也是我使用的。小心点,因为如果您尝试在那里运行GUI线程,它会锁定您的GUI线程。我还使用process.outputdatareceived,这是我捕获控制台输出的地方。@public敌手,您从哪里开始第二个进程?在第一个进程调用WaitForExit()后,它应该在同一个线程上。编辑了我的问题。我无法在注释中添加代码,这正是我在上一条注释中的意图。@public敌手,您应该在process.WaitForExit()之前调用process.BeginOutputReadLine()。