【问题标题】:WPF. not closed wpf application from another application (servise)WPF。未从另一个应用程序(服务)关闭 wpf 应用程序
【发布时间】:2019-03-06 10:37:17
【问题描述】:

我有 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()。

我觉得解决方案应该很简单,不用第三方库。

【问题讨论】:

  • 好问题,但我无法弄清楚关于关闭进程的“暴力”代码与关闭窗口有什么关系......
  • @JB,我想用 svn 更新我的应用程序。为此,我启动了一个控制台应用程序来关闭我的 wpf 应用程序,执行更新并重新启动应用程序。 process.Kill() 方法做了我需要的一切,但是有一个问题!我需要在关闭wpf的时候释放所有资源,而kill()不会这样做。 + 在托盘中保留图标

标签: c# wpf


【解决方案1】:
var proc = Process.GetProcessesByName("WPFProcName").First();
proc.CloseMainWindow();

完成这项工作并同时调用App.Exit 和Window.Closed。
检查是否找到进程(您使用正确的名称)。您也可以尝试以管理员权限启动控制台。

【讨论】:

  • 谢谢!管理员权限真的解决了我的问题,一切正常!但这很奇怪,我将不得不寻找以管理员权限启动控制台应用程序的方法。
【解决方案2】:

您可以使用 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   
}

【讨论】:

  • 不幸的是,我没有调用 OnExit ()。
【解决方案3】:

根据您的特定评论回答:

与其杀死你自己的进程,不如给他一个信号。例如使用命名事件(可能是类EventWaitHandle)。

指定事件上的主进程Wait(),当收到信号时它会正确关闭,而杀手/更新者Set()事件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-19
    相关资源
    最近更新 更多