1

我嘗試使用Parallel.For來運行進程並獲得並行輸出。Process StandardOutput ReadToEnd多個進程得到空/空字符串

示例代碼:

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 
     } 
    } 
} 

A.exe時碼

internal class Program 
{ 
    private static void Main(string[] args) 
    { 
     for (int i = 0; i < 10; i++) 
     { 
      for (int j = 0; j < 40; j++) 
      { 
       Console.Write("A"); 
      } 
      Console.Write(Environment.NewLine); 
     } 
    } 
} 

有誰知道爲什麼會輸出空,我怎麼能避免獲得空的結果?

回答

0

我試圖找出爲什麼在流中爲null。

如果在A.exe輸出前加上Thread.Sleep(),主進程的ReadToEnd()會等待A.exe輸出並得到結果。

只有一種情況會導致null流是A.exe退出並且沒有輸出。

這會讓ReadToEnd()變爲空,並且Peek()沒有幫助,因爲A.exe退出並且不再輸出。

我覺得我的問題是我的程序運行時重載了Windows Server 2003 R2 32bit,Process.Start()沒有得到異常,進程無法啓動。它不會導致輸出流,流程退出和流關閉。

+0

您是否嘗試過'a.SystemError'流? – VMAtm