Вот код C #, который я использую для запуска подпроцесса и контроля его вывода:
using (process = new Process()) {
process.StartInfo.FileName = executable;
process.StartInfo.Arguments = args;
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.CreateNoWindow = true;
process.Start();
using (StreamReader sr = process.StandardOutput) {
string line = null;
while ((line = sr.ReadLine()) != null) {
processOutput(line);
}
}
if (process.ExitCode == 0) {
jobStatus.State = ActionState.CompletedNormally;
jobStatus.Progress = 100;
} else {
jobStatus.State = ActionState.CompletedAbnormally;
}
OnStatusUpdated(jobStatus);
}
Я запускаю несколько подпроцессов в отдельных потоках ThreadPool (но не более четырех одновременно, начетырехъядерный станок).Это все работает нормально.
Проблема, с которой я столкнулся, заключается в том, что один из моих подпроцессов завершит свою работу, но соответствующий вызов sr.ReadLine()
будет заблокирован, пока ДРУГОЙ один из моих подпроцессов не завершится.Я не уверен, что он возвращает, но это НЕ должно происходить, если я что-то упускаю.
В моем подпроцессе нет ничего, что могло бы их каким-либо образом "связать" - они нене общаются друг с другом.Я даже могу посмотреть в диспетчере задач / Process Explorer, когда это происходит, и увидеть, что мой подпроцесс фактически завершился, но вызов ReadLine()
на его стандартном выходе все еще блокирует!
Я смогчтобы обойти это, выкрутив выходной код мониторинга в новый поток и выполнив process.WaitForExit()
, но это выглядит как очень странное поведение.Кто-нибудь знает, что здесь происходит?