2012-02-15 2 views
1

У меня есть следующий код, который хорошо работает на другом сервере. Проблема в том, что этот процесс никогда не превращает его в состояние «Выход». Вызываемый exe создает файл как последний шаг, и этот файл создается, но мой код никогда не знает, что процесс завершен. Кроме того, exe, который вызывается, выполняется намного меньше, чем 10 секунд, когда выполняется вручную. Мой код выглядит так:System.Diagnostics.Process не выходит из кода

   System.Diagnostics.Process proc = new System.Diagnostics.Process() proc.StartInfo.RedirectStandardOutput = true; 
       proc.StartInfo.RedirectStandardError = true; 
       proc.StartInfo.UseShellExecute = false; 
       proc.StartInfo.CreateNoWindow = true; 
       proc.StartInfo.FileName = exeConf.CMD; 
       proc.StartInfo.Arguments = argString; 
       proc.Start(); 
       proc.WaitForExit(10000); 

       if(proc.HasExited) 
       msgLine = proc.StandardError.ReadToEnd(); 
+0

Дополнительная информация о другом процессе будет полезна. – cadrell0

ответ

1

Кажется, что proc.StandardOutput.ReadToEnd() должен быть вызван сразу после proc.Start() иначе он может создать тупик.

+0

Это не имеет смысла. Поскольку, возможно, не будет никакого вывода, если у вас есть 'System.Diagnostics.Process.Start()' ed. –

7

См. this MSDN артикул.

Условие блокировки может возникнуть, если родительский процесс вызывает p.WaitForExit до p.StandardOutput.ReadToEnd, а дочерний процесс записывает достаточно текста для заполнения перенаправленного потока. Родительский процесс будет бесконечно ждать завершения дочернего процесса. Детский процесс будет бесконечно ждать, пока родитель не прочитает полный поток StandardOutput.

+0

Когда я комментирую ожидание, тогда я код замораживается в этой строке: msgLine = proc.StandardError.ReadToEnd(); – NomadicDeveloper

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