Чому метод Exited мого процесу не викликається?


96

У мене є наступний код, але чому ProcessExitedметод ніколи не викликається? Те саме, якщо я не використовую оболонку Windows ( startInfo.UseShellExecute = false).

ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.CreateNoWindow = true;
startInfo.UseShellExecute = true;
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.FileName = path;
startInfo.Arguments = rawDataFileName;
startInfo.WorkingDirectory = Util.GetParentDirectory(path, 1);

try
{
     Process correctionProcess = Process.Start(startInfo);
     correctionProcess.Exited += new EventHandler(ProcessExited);                   

     correctionProcess.WaitForExit();

     status = true;
}

.....

internal void ProcessExited(object sender, System.EventArgs e)
{
      //print out here
}

Відповіді:


241

Для того, щоб отримати зворотний дзвінок на Exitedподію, EnableRaisingEventsпотрібно встановити значення true.

Process correctionProcess = Process.Start(startInfo);
correctionProcess.EnableRaisingEvents = true;
correctionProcess.Exited += new EventHandler(ProcessExited); 

3
IspravkaProcess.WaitForExit (), без цієї функції цей код для мене не працює
Кіра

7
Одна невелика порада (особливо для експертів, які не займаються C #): не виконуйте Close()процес! Я зіткнувся з періодичною проблемою з обробником Exit через помилкові зусилля при управлінні ресурсами. Код, про який йдеться, викликався Process.Close()після Process.Start(startInfo), а не дозволяв GC збирати його в свій час. Легка помилка, якщо ваше тло не є мовами GC (наприклад, C / C ++).
Єжи

3
Чудово. Дякую. Я також хочу зазначити, що присвоєння EnableRaisingEventsі EventHandlersповинно бути зроблено саме після Process.Start(). Інакше це не спрацює.
Дорук

2
@Doruk Я можу встановити EnableRaisingEvents=trueперед дзвінком, Process.Start()і це чудово працює.
Action Dan

29

Від MSDN :

Подія Exited вказує на те, що пов'язаний процес завершено. Цей випадок означає або те, що процес завершено (припинено) або успішно закрито. Ця подія може статися, лише якщо значення властивості EnableRaisingEvents має значення true.

Ви встановили для цієї властивості значення true?


19
Це теж дуже неідоматичний прапор (яка користь у будь-якому випадку, якщо я не хочу події, я не підписуюсь на неї!)
Тамас Селей

3
Не дуже інтуїтивно. Потрібно чітко зазначити в описі кожної події, що для цього потрібно встановити цей прапор.
TheLegendaryCopyCoder



9

Я стикався з прикладами, які розміщені new Process()в usingреченні. Не робіть цього, якщо ви хочете використовувати цю Exitedфункцію. usingПоложення знищує екземпляр разом з будь-якими ручками подій на Exited.

Цей ...

using(var process = new Process())
{
   // your logic here
}

Має бути це ...

var process = new Process();

Я теж це помітив. Як не дивно, події OutputDataReceived працюють нормально. Або вони можуть відбуватися настільки швидко, що закінчуються до того, як виконання в основному потоці завершиться.
AlexVB
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.