У меня есть wpf и консольное приложение. Я хочу правильно закрыть приложение wpf из другого приложения.
Код закрытия приложения:
public static async Task CloseProcessAsync(string processName) {
await Task.Run(() => {
try {
foreach (var process in Process.GetProcessesByName(processName)) {
process.Close();
}
} catch (Exception e) {
Logger.Error($"Utils.utils.FileUtils.{MethodBase.GetCurrentMethod().Name}: {e.Message}");
}
});
}
Код обработки вложения:
private void MainWindow_OnClosed(object sender, EventArgs e) {
Logger.Debug(MethodBase.GetCurrentMethod().Name);
}
private void MainWindow_OnClosing(object sender, CancelEventArgs e) {
Logger.Debug(MethodBase.GetCurrentMethod().Name);
}
Проблема в том, что методы Close()\Dispose()\CloseMainWindow() не работают в приложении wpf. Логи пустые
Я пытался решить проблему, как указано здесь. Но в моем случае метод CloseMainWindow() не работает, даже когда графический интерфейс приложения WPF открыт.
Насколько я понимаю, мне нужно специальное средство для обработки запроса закрытия в приложении wpf, а не просто переопределение методов MainWindow_OnClosing() или MainWindow_OnClosed().
Я думаю, что решение должно быть очень простым, без использования сторонних библиотек.
var proc = Process.GetProcessesByName("WPFProcName").First();
proc.CloseMainWindow();
Выполняет ли работа и App.Exit
и Window.Closed
при вызове.
Убедитесь, что процесс найден (вы используете правильное имя). Также вы можете попробовать запустить консоль с правами администратора.
Отвечая с вашим конкретным комментарием:
Вместо того, чтобы убивать свой собственный процесс, отправьте ему сигнал. Например с именованным событием (может быть, класс EventWaitHandle
).
Основной процесс Wait()
для именованного события, и он будет корректно завершать работу при получении сигнала, а убийца/средство обновления Set()
событие.
Вы можете использовать команду Windows taskkill:
var yourWpfProcessName= "";
var taskKillProcessInfo = new ProcessStartInfo($"taskkill /im {yourWpfProcessName}");
var taskKillProcess = Process.Start(taskKillProcessInfo);
taskKillProcess .WaitForExit();
if(taskKillProcess.ExitCode==0)
//success
Затем подключите событие Exit объекта Application для очистки ресурсов:
// in App.Xaml
protected override void OnExit(ExitEventArgs e)
{
//clean up resources
}