WPF。未从另一个应用程序(服务)关闭wpf应用程序

时间:2019-03-06 10:37:18

标签: c# wpf

我有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}");
                              }
                        });
}

Сlosure处理代码:

    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应用程序上不起作用。日志为空

我试图解决here所述的问题。但就我而言,即使打开WPF应用程序的GUI,CloseMainWindow()方法也不起作用。

据我了解,我需要一种特殊的方式来处理wpf应用程序中的关闭请求,而不仅仅是覆盖方法MainWindow_OnClosing()或MainWindow_OnClosed()。

我认为解决方案应该非常简单,无需使用第三方库。

3 个答案:

答案 0 :(得分:0)

您可以使用Windows taskkill命令:

var yourWpfProcessName= "";
var taskKillProcessInfo = new ProcessStartInfo($"taskkill /im {yourWpfProcessName}");
var taskKillProcess = Process.Start(taskKillProcessInfo);
 taskKillProcess .WaitForExit();
if(taskKillProcess.ExitCode==0)
    //success

然后连接到Application对象的Exit事件以清理资源:

// in App.Xaml
protected override void OnExit(ExitEventArgs e)
{ 
//clean up resources   
}

答案 1 :(得分:0)

var proc = Process.GetProcessesByName("WPFProcName").First();
proc.CloseMainWindow();

执行作业并同时调用App.ExitWindow.Closed
检查找到的进程(您使用正确的名称)。您也可以尝试以管理员权限启动控制台。

答案 2 :(得分:0)

考虑到您的特定评论:

不要杀死自己的进程,而是给他发送信号。例如,使用命名事件(可能是类EventWaitHandle)。

有关命名事件的主进程Wait(),并在发出信号时将其正确关闭,而杀手/更新程序Set()则终止该事件。