Выполнить несколько Process.Start () последовательно в C # - PullRequest
3 голосов
/ 06 июня 2011

Я выполняю 3 exe, используя Process.Start() в моем приложении C #. Я хочу запустить все эти файлы последовательно. Прямо сейчас каждый Process.Start() выполняется самостоятельно параллельно.

например:

Process.Start(exe1ForCopying_A_50_Mb_File);      
Process.Start(exe2ForCopying_A_10_Mb_File);  
Process.Start(exe3ForCopying_A_20_Mb_File);

Я хочу, чтобы мой второй Process.Start() начал выполнять ТОЛЬКО ПОСЛЕ того, как первый Process.Start() завершил копирование файла размером 50 Мб (на это уйдет около 1 или 2 минут).

Есть предложения?

Спасибо.

Ответы [ 3 ]

10 голосов
/ 14 марта 2012

Я думаю, что получил ответ сам ..! :)

Process process = new Process(); 
ProcessStartInfo startInfo = new ProcessStartInfo(); 
startInfo.FileName = MyExe; 
startInfo.Arguments = ArgumentsForMyExe; 
process.StartInfo = startInfo; 
process.Start(); 
process.WaitForExit(); // This is the line which answers my question :) 

Спасибо за предложение ВАШхх ..

0 голосов
/ 06 июня 2011

Вы можете либо запустить фоновый поток или задачу и ожидать синхронно в цикле (используя WaitForExit), либо использовать асинхронный подход.

Создать объекты Process один за другим и подключить событиеобработчик события Exited, которое продолжается со следующим процессом.Создайте их с помощью конструктора Process, подключите обработчик события Exited и затем вызовите Start;в противном случае, используя статический Process.Start, если процесс завершается сбоем между временем, когда Process.Start возвращается, и обработчик события присоединен, я думаю, что обработчик события не будет вызван, поскольку он строго завершился.Подтверждение концепции: (не обрабатывает удаление, доступ к очереди не является потокобезопасным, хотя его должно быть достаточно, если он действительно последовательный и т. Д.)

Queue<Process> ProcessesToRun = new Queue<Process>(new []{ new Process("1"), new Process("2"), new Process("3") });

void ProcessExited(object sender, System.EventArgs e) {
    GrabNextProcessAndRun();
}

void GrabNextProcessAndRun() {
    if (ProcessesToRun.Count > 0) {
        Process process = ProcessesToRun.Dequeue();
        process.Exited += ProcessExited;
        process.Start();
    }
}

void TheEntryPoint() {
    GrabNextProcessAndRun();
}
0 голосов
/ 06 июня 2011

Вы можете:

  • Использовать фоновый рабочий http://msdn.microsoft.com/it-it/library/system.componentmodel.backgroundworker%28v=vs.95%29.aspx и прикрепить к дескриптору RunWorkerCompleted (затем выполнить второй процесс таким же образом)
  • Создайте свое собственное событие внутри параллельного метода и запустите его, когда вы закончите
...