Причина этого в том, что System.Diagnostics.Process
буквально контролирует процесс, к которому он подключен.
Одним из способов обойти эту проблему было бы для первого приложения для вывода, когда он запускает второе приложение, и когда этот вывод будет получен, монитор из основного приложения для создания процесса из (теперь третьего) заявление. После запуска третьего приложения он должен появиться в массиве System.Diagnostics.Process.GetProcesses()
, и затем вы можете прикрепить его к событию OutputDataReceived
.
Ваш код будет выглядеть примерно так (непроверенный):
private void firstProcess_OutputDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)
{
if (e.Data == "Starting next process")
{
System.Diagnostics.Process newProcess = null;
while (newProcess == null)
{
System.Diagnostics.Process[] procs = System.Diagnostics.Process.GetProcesses();
foreach (System.Diagnostics.Process proc in procs)
{
if (proc.ProcessName == "newProcess")
{
newProcess = proc;
break;
}
}
System.Threading.Thread.Sleep(100);
}
newProcess.OutputDataReceived += new System.Diagnostics.DataReceivedEventHandler(newProcess_OutputDataReceived);
}
}
void newProcess_OutputDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)
{
// Do something with your data received here.
}
Заметьте, что это всего лишь пример, и если ваш третий процесс не запускается, или заканчивается слишком быстро, то этот метод будет висеть в бесконечном цикле. Этот образец просто предназначен для того, чтобы предоставить вам знания для создания чего-то, что работает в вашем конкретном случае, с которым я не совсем знаком. Вы должны, по крайней мере, убедиться, что цикл while не будет продолжаться вечно, и вы, вероятно, захотите сделать еще несколько изменений.
EDIT: В противном случае, если вы не можете изменить исходный код для первого приложения, вы можете просто создать новый поток, который отслеживался таким образом (используя цикл while) постоянно и обрабатывать выходные данные третьего процесса в отдельный класс или просто перенастроить вывод из третьего процесса в обработчик для вывода второго процесса, чтобы у вас мог быть один метод обработки всего вывода для обоих процессов.
Во-первых, я поражен тем, как быстро вы ответили такими подробностями, и я очень ценю вашу помощь. Из вывода первого процесса я могу определить точку, в которой был запущен второй процесс. –
К сожалению, в структуре .Net не существует объекта, который так же хорош для «консолидатора процессов», как cmd.exe (при запуске вручную). –
Я мог бы помочь: D –