2015-09-13 2 views
0

у меня есть начали беспроигрышные формы приложения с некоторыми кодами FormClosing() & FormClosed() событий.
С другим приложением я хочу, чтобы принудительно закрыть это первое приложение, как это:WinForm приложения -> End Process -> FormClosing() & FormClosed() события не сгорело

string procId = proc.Id.ToString(); 

    ProcessStartInfo startInfo = new ProcessStartInfo(); 
    startInfo.FileName = "taskkill.exe"; 
    startInfo.WindowStyle = ProcessWindowStyle.Hidden; 
    startInfo.Arguments = "/f /t /pid " + procId; 
    Process.Start(startInfo); 

Когда я хочу для принудительного близкого первого заявления этих кодов или с помощью с Task Manager -> Завершить процесс, FormClosing() & FormClosed() События не производятся.

Как я могу заставить эти события стрелять в любой ситуации или в каком качестве?

+1

Если ваш процесс убит, вы ничего не можете сделать. _Why_ вы хотите, чтобы этот код запускался? Не можете ли вы очистить убитый экземпляр при следующем запуске? – CodeCaster

+0

Ни один человек, при запуске и закрытии у меня разные коды для записи некоторых данных в файл. Я не могу их изменить! – MoonLight

+1

проверить этот вопрос: : http: //stackoverflow.com/questions/474679/capture-console-exit-c-sharp –

ответ

1

См. Prevent C# app from process kill.

Невозможно предотвратить завершение процесса вашего приложения, и вы не получите событие, которое оно прекращает.

Итак, вы должны угодить случаю, когда процесс не очищался красиво при выключении. В этом случае вам все равно нужно это сделать, что, если машина BSOD пока работает ваше приложение? Вы никогда не можете считать, что предыдущий экземпляр успешно завершен.

Похоже, ваше приложение закрывает файл данных после выключения, так что в следующий раз, когда программа запустится, он снова сможет прочитать файл. Если это так, вы можете написать «грязный флаг» в файле или рядом с ним и очистить файл при запуске, если он помечен.

Как объяснено в How does task manager kill my program? и MSDN: Terminating a Process (Windows):

Обратите внимание, что вы не можете перехватывать или среагировать на TerminateProcess. Ваш процесс умрет, и вы ничего не сможете сделать, прежде чем это произойдет.

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

0

Возможно, это глупый вопрос, но почему вы просто не попросите приложение закрыть себя? Довольно легко построить линию связи между двумя приложениями, и пусть последнее приложение сообщит другому приложению, которое оно должно прекратить.

тогда у вас была бы возможность выполнить чистое выключение.