WPF. не закрытое приложение wpf из другого приложения (сервис)

2

У меня есть 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().

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

  • 0
    Хороший вопрос, но я не могу понять, как «насильственный» код закрытия процесса в некоторой степени связан с закрытием окна ...
  • 0
    @JB, я хочу обновить свое приложение с помощью SVN. Для этого я запускаю консольное приложение, которое закрывает мое приложение wpf, выполняет обновление и снова запускает приложение. Метод process.Kill () делает все, что мне нужно, но есть проблема! Мне нужно освободить все ресурсы при закрытии wpf, а kill () этого не делает. + остается иконка в трее
Теги:
wpf

3 ответа

0
Лучший ответ
var proc = Process.GetProcessesByName("WPFProcName").First();
proc.CloseMainWindow();

Выполняет ли работа и App.Exit и Window.Closed при вызове.
Убедитесь, что процесс найден (вы используете правильное имя). Также вы можете попробовать запустить консоль с правами администратора.

  • 0
    Спасибо! Права администратора действительно решают мою проблему, и все получается! Но это очень странно, и мне придется искать способы запуска консольного приложения с правами администратора.
0

Отвечая с вашим конкретным комментарием:

Вместо того, чтобы убивать свой собственный процесс, отправьте ему сигнал. Например с именованным событием (может быть, класс EventWaitHandle).

Основной процесс Wait() для именованного события, и он будет корректно завершать работу при получении сигнала, а убийца/средство обновления Set() событие.

0

Вы можете использовать команду 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   
}
  • 0
    К сожалению, OnExit () не вызывается для меня.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню