C# 在c中运行命令并等待完成#

C# 在c中运行命令并等待完成#,c#,C#,我需要在我的c#程序中这样做 我的命令执行正确,但问题是解析日志代码不会等待cmd1和cmd2执行完成。我不能调用退出和进程。waitforexit,因为在解析日志之后,我有更多的命令要执行 下面是如何设置进程开始信息。LaunchCommandWindow() 如何让解析日志代码等待cmd2完成 谢谢。如果“cmd2”将完成写入标准输出流,您可以监听标准输出,直到看到该事件,然后从那里开始处理。创建新线程以运行任务 使用BackgroundWorker 当它完成时,它会引发一个事件(在主线程中

我需要在我的c#程序中这样做

我的命令执行正确,但问题是解析日志代码不会等待cmd1和cmd2执行完成。我不能调用退出和进程。waitforexit,因为在解析日志之后,我有更多的命令要执行

下面是如何设置进程开始信息。LaunchCommandWindow()

如何让解析日志代码等待cmd2完成


谢谢。

如果“cmd2”将完成写入标准输出流,您可以监听标准输出,直到看到该事件,然后从那里开始处理。

创建新线程以运行任务

使用
BackgroundWorker

当它完成时,它会引发一个事件(在主线程中),您可以从中继续运行

这将防止您的程序挂起,如果还有其他工作要做,它可以允许您在其他线程运行时执行

-----编辑-----

经过进一步研究,以下是对其余部分的思考: 如果要读取输出,则必须将
RedirectStandardOutput
设置为true

如果不必在同一窗口中同时运行这两个命令,可以调用
process.WaitForExit(int)

其中int是等待的毫秒数,然后启动一个新进程(或带有新参数的
process
)来启动cmd2。

我认为process.WaitForExit()方法正是您需要的。还有进程。已退出属性。

要启动,请使用类似“cmd/C cmd1&cmd2”的命令。我看不出这和手头的问题有什么关系。任何时候他要运行这样的东西,都会有人忙着等待,除非他把一些东西放在一起,可以运行命令窗口,并在完成时报告它的进度。这是我的“新线索”回答的导语。在我回答的其余部分编辑。很抱歉耽搁了,我不得不翻阅我的一些旧代码,了解我上次是如何处理的。使用
WaitForExit
可以避免在输出上执行读取循环,并产生稍微更稳定(和可维护)的代码-您无法进入编写输出流时读取输出流的竞争状态(如果这仍然是一个问题…我不确定是否是),这将起作用,尽管主线程在寻找完成消息时会进入忙等待状态。新线程将防止程序进入“无响应”状态。+1他还需要将
RedirectStandardOutput
设置为true才能执行此操作。@Jeff:既然顺序在这里很重要,线程应该在更高级别上进行。这也可能是一个命令行程序,在这种情况下,这样的行为可能是需要的。@Jeff:不管怎样,这都是正确的-但是,如果这是一个控制台应用程序,并且这是它唯一的用途,这可能是需要的。谢谢你的回答。但这不是我的选择。重定向的唯一问题是输出在屏幕上不可见,我需要它。是否有一种方法可以重定向并显示输出?谢谢
           Process process = LaunchCommandWindow("Special args and environment set")
           process.StandardInput.WriteLine("cmd1");
           process.StandardInput.WriteLine("cmd2");

           //Parse logs
            using (Streamreader sr =  new ())
           { etc etc..}
         ProcessStartInfo startInfo = new ProcessStartInfo();

        startInfo.FileName = Path.Combine(Environment.SystemDirectory, "cmd.exe");
        startInfo.Arguments = "/K " + newEnvironmentArgs;

        startInfo.UseShellExecute = false; 
        startInfo.RedirectStandardInput = true;
        Process process = new Process();
        process.StartInfo = startInfo;
        process.Start();

        return process;