Проблемы DeadLock в процессе. StandardOutput. ReadToEnd ();

Сколько из тех строк регистрируется по умолчанию? Я работал над системой очень как то, что Вы описываете - просто начальная загрузка, она заставила бы более чем 20 МБ журналов быть записанными, если бы вход был проворачиваемым путем, но даже отладка мы не поворачивали все это путь ко всем модулям. По умолчанию это зарегистрировалось бы, когда модуль кода вводился, и главные системные события. Это было большим для отладки, так как QA мог просто присоединить журнал к билету, и даже если это не было восстанавливаемо, Вы видели то, что продолжалось, когда проблема произошла. Если у Вас есть серьезная многопоточность, идущая на тогда вход, еще лучше, чем какой-либо IDE или отладчик, с которым я работал.

7
задан Graviton 25 September 2009 в 08:00
поделиться

2 ответа

Короче говоря, вот что может происходит:

Приложение A (ваш код выше) запускает дочерний процесс B и перенаправляет стандартный вывод. Затем A ожидает завершения процесса B. Пока A ожидает выхода B, B производит вывод в выходной поток (который A перенаправил). Этот поток имеет ограниченный размер буфера. Если буфер заполняется, его необходимо очистить, чтобы B мог продолжить запись в него. Поскольку A не читает, пока B не выйдет, вы можете оказаться в ситуации, когда B будет ждать опустошения выходного буфера, а A будет ждать выхода B. Оба ждут действий друг друга, и у вас тупиковая ситуация.

Вы можете попробовать следующий код, чтобы продемонстрировать проблему:

ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = "cmd";
psi.Arguments = @"/c dir C:\windows /s";
psi.RedirectStandardOutput = true;
psi.UseShellExecute = false;
Process p = Process.Start(psi);
p.WaitForExit();
string output = p.StandardOutput.ReadToEnd();

Это (скорее всего) приведет к ситуации, когда выходной поток заполнен, так что дочерний процесс (в данном случае "cmd" ) будет ждать его очистки, а приведенный выше код будет ждать завершения cmd .

12
ответ дан 6 December 2019 в 21:16
поделиться

The parent process is the one calling p.Start(). I guess this is your application (the caller). The child process is p or in other words, the callee.

0
ответ дан 6 December 2019 в 21:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: