C # - Возможно ли перехватить событие <Process>.Exited, запущенное из основного процесса? - PullRequest
4 голосов
/ 20 июля 2011

Я пишу консольное приложение C # и пытаюсь проверить, когда завершился процесс моей основной программы, чтобы я мог выполнить некоторую очистку перед выходом, но событие, похоже, никогда не сработало. Вот код для установки обработчика события:

Process process = Process.GetCurrentProcess();
CloseConsoleHandler close = new CloseConsoleHandler(test);
process.EnableRaisingEvents = true;
process.Exited += close.CloseHandler; 
//I also tried process.Exited += new EventHandler(close.CloseHandler);

Похоже, что он никогда не срабатывает, ни когда программа завершается естественным образом, ни когда я нажимаю кнопку закрытия ... никогда. Это вообще возможно?

Ответы [ 7 ]

8 голосов
/ 20 июля 2011

Это не сработает; как только процесс завершится, ваш код ушел .

Обработка события AppDomain.ProcessExit .

5 голосов
/ 20 июля 2011

Процесс exited Событие должно логически запускаться ПОСЛЕ завершения процесса, поэтому невозможно отследить его собственный выход.

Но есть и другие альтернативы, такие как реализация Dispose в вашем классе, чтобы сделатьочистка, или по какой-то причине вам нужно событие «Выход из процесса», просто следите за процессом из другого процесса.

2 голосов
/ 12 июня 2013

Используйте

        Process p = new Process();
        p.EnableRaisingEvents = true;
1 голос
/ 25 мая 2016

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

class Program
{
    static void Main(string[] args)
    {
        // Register hanlder to ProcessExit event
        AppDomain.CurrentDomain.ProcessExit += ProcessExitHanlder;
    }

    private static void ProcessExitHanlder(object sender, EventArgs e)
    {
        Console.WriteLine("Cleanup!");
    }
}
1 голос
/ 19 декабря 2012

Или вы можете попытаться решить эту проблему на уровне приложения, если у вас тоже есть основное приложение (звучит так): сигнализировать дочерний процесс из основного приложения с помощью некоторой техники, когда основное приложение закрывается.Может быть, в этот раз я попытаюсь подать сигнал синхронно, поэтому основное приложение оставляет время для очистки ребенка.Этот подход имеет свои недостатки, хотя.Идеально было бы перехватить какое-нибудь системное событие в вашем дочернем процессе.

1 голос
/ 20 июля 2011

Process.Exit вызывается только для связанных процессов и после завершения. Попробуйте использовать событие ProcessExit текущего AppDomain.

0 голосов
/ 20 июля 2011

AFAIK есть два способа - в зависимости от ваших предпочтений один способ P / Invoke (см. http://osdir.com/ml/windows.devel.dotnet.clr/2003-11/msg00214.html) ... это вызывает делегата, которого вы определяете в отдельном потоке при выходе из вашего приложения, и работает с консолью...

Другой способ - AppDomain.ProcessExit - с ограничением по времени, которое разрешено запускать (по умолчанию 3 секунды).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...