Process StandardOutput ReadToEnd在多个进程时获取null /空字符串

时间:2015-08-28 05:54:26

标签: c# multithreading task-parallel-library redirectstandardoutput

我尝试使用<item name="android:windowNoTitle">true</item> <item name="android:windowActionBar">false</item> <item name="android:windowFullscreen">true</item> <item name="android:windowContentOverlay">@null</item> 来运行进程并并行获取输出。

示例代码如下:

Parallel.For

A.exe代码

internal class Program
{
    private static void Main(string[] args)
    {
        var bag = new ConcurrentBag<string>();
        Parallel.For(0, int.MaxValue, i =>
        {
            bag.Add(MyMethod());
        });
    }

    public static string MyMethod()
    {
        using (var a = new Process())
        {
            a.StartInfo.FileName = "A.exe";
            a.StartInfo.RedirectStandardError = true;
            a.StartInfo.RedirectStandardInput = true;
            a.StartInfo.RedirectStandardOutput = true;
            a.StartInfo.CreateNoWindow = true;
            a.StartInfo.UseShellExecute = false;
            a.StartInfo.ErrorDialog = false;
            a.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;

            a.Start();
            string output = a.StandardOutput.ReadToEnd();
            a.WaitForExit();
            return output; // sometime output will be null
        }
    }
}

有谁知道为什么输出会为null,我怎么能避免得到null结果?

1 个答案:

答案 0 :(得分:0)

我试图找出为什么在流中获取null。

如果我在A.exe输出之前添加Thread.Sleep(),主进程的ReadToEnd()将等待A.exe输出并获得结果。

只有一种情况会导致空流是A.exe退出而没有输出。

这会让ReadToEnd()变为空,Peek()没有帮助,因为A.exe退出,不再输出了。

我认为我的问题是我的程序在负载很重的Windows Server 2003 R2 32bit上运行,Process.Start()在进程无法启动时没有异常。它不会导致输出流,流程退出和流关闭。