我有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()。
我认为解决方案应该非常简单,无需使用第三方库。
答案 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.Exit
和Window.Closed
。
检查找到的进程(您使用正确的名称)。您也可以尝试以管理员权限启动控制台。
答案 2 :(得分:0)
考虑到您的特定评论:
不要杀死自己的进程,而是给他发送信号。例如,使用命名事件(可能是类EventWaitHandle
)。
有关命名事件的主进程Wait()
,并在发出信号时将其正确关闭,而杀手/更新程序Set()
则终止该事件。