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 в потоке.

Если я добавлю Thread.Sleep() до выхода A.exe, то главный процесс ReadToEnd() будет ожидать выхода A.exe и получить результат.

Только одна ситуация вызовет пустой поток - выход A.exe и отсутствие выхода.

Это позволит ReadToEnd() получить нуль, а Peek() не помогло, так как A.exe выходит и больше не выводит больше.

Я думаю, что моя проблема в том, что моя программа работает при тяжелой загрузке. Windows Server 2003 R2 32bit, Process.Start() не получал исключения, когда процесс не запускался. Это не приводит к потоку вывода, завершению процесса и потоку.

+0

Пробовал ли поток 'a.SystemError'? – VMAtm

Смежные вопросы