【问题标题】:How do I run processes synchronously, targeting the same output?如何同步运行进程,以相同的输出为目标?
【发布时间】:2010-06-22 18:39:09
【问题描述】:

我有一个需要运行多个可执行文件的 .Net 应用程序。我正在使用 Process 类,但 Process.Start 不会阻塞。我需要在第二次运行之前完成第一个过程。我该怎么做?

另外,我希望所有进程都输出到同一个控制台窗口。事实上,他们似乎打开了自己的窗户。我确定我可以使用 StandardOutput 流写入控制台,但是如何抑制默认输出?

【问题讨论】:

    标签: c# .net process stdout


    【解决方案1】:

    我相信您正在寻找:

    Process p = Process.Start("myapp.exe");
    p.WaitForExit();
    

    输出:

    StreamReader stdOut = p.StandardOutput;
    

    然后你可以像使用任何流阅读器一样使用它。

    要抑制窗口有点困难:

    ProcessStartInfo pi = new ProcessStartInfo("myapp.exe");
    pi.CreateNoWindow = true;
    pi.UseShellExecute = true;
    
    // Also, for the std in/out you have to start it this way too to override:
    pi.RedirectStandardOutput = true; // Will enable .StandardOutput
    
    Process p = Process.Start(pi);
    

    【讨论】:

    • 完美!关于输出的任何想法?
    • 但是如何抑制每个进程弹出的控制台窗口?
    • 我现在可以正常工作了。感谢您的帮助。应该注意的是,当我将 RedirectStandardOutput 和 UseShellExecute 都设置为 true 时出现异常。此外,一旦我重定向了输出,我就不能再使用 WaitForExit。它会无限期地阻塞。然而,从 StandardOutput 读取可以解决这个问题。
    • 是的,我已经有一段时间没有使用它了,很高兴你能用它。
    • 您需要将 UseShellExecute 设置为 true 才能尊重动词,并且必须将其设置为“false”以重定向标准输出。你不能两者都做。我很确定 Windows 也不允许您跨管理员/非管理员安全边界重定向标准输入/输出/错误。您必须找到一种不同的方法来从以管理员身份运行的程序中获取输出 - 参考:stackoverflow.com/a/8690661
    猜你喜欢
    • 1970-01-01
    • 2019-11-28
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多