如何在应用退出时执行代码?CoreApplicationExiting未触发问题
UWP应用CoreApplicationExiting事件未触发的解决方法
问题分析
在UWP中,Application.Current.Exit()会直接终止应用进程,但CoreApplication.Exiting事件仅在应用进程自然终止(比如用户关闭窗口、系统强制终止应用)时触发,手动调用Application.Exit()可能不会触发该事件。此外,UWP应用的常规生命周期流程是挂起而非直接退出,大部分场景下Application.Suspending事件才是触发日志刷新的关键时机。
解决方案
1. 同时订阅挂起与退出事件
同时处理Application.Suspending和CoreApplication.Exiting事件,覆盖所有可能的应用终止场景:
public partial class App : Application { public App() { Serilog.Log.Logger = new LoggerConfiguration() .WriteTo.Console() .WriteTo.File(ApplicationData.Current.LocalFolder.Path + "\\.log", rollingInterval: RollingInterval.Day, outputTemplate: "[{Timestamp:HH:mm:ss.fff} {SourceContext} [{Level}] {Message}{NewLine}{Exception}") .MinimumLevel.Debug() .CreateLogger(); Serilog.Log.Information("Starting App at: " + DateTime.Now); base.UnhandledException += App_UnhandledException; CoreApplication.Exiting += CoreApplicationExiting; // 添加挂起事件订阅 this.Suspending += App_Suspending; InitializeComponent(); Host = Microsoft.Extensions.Hosting.Host .CreateDefaultBuilder() .UseContentRoot(AppContext.BaseDirectory) .UseSerilog() .ConfigureServices((context, services) => { // 服务配置代码... }) .Build(); } private void CoreApplicationExiting(object? sender, object e) { Serilog.Log.CloseAndFlush(); } private void App_Suspending(object sender, SuspendingEventArgs e) { // 获取延迟对象确保日志刷新完成 var deferral = e.SuspendingOperation.GetDeferral(); try { Serilog.Log.CloseAndFlush(); } finally { deferral.Complete(); } } }
2. 手动触发日志刷新再退出
如果你的场景需要通过按钮直接退出应用,可以在调用Exit()前手动刷新日志:
private void tryExit(object sender, RoutedEventArgs e) { Serilog.Log.CloseAndFlush(); Application.Current.Exit(); }
3. 同步宿主与应用生命周期
若使用了Microsoft.Extensions.Hosting,添加UseWindowsLifetime()确保宿主生命周期与UWP应用同步,避免事件被宿主拦截:
Host = Microsoft.Extensions.Hosting.Host .CreateDefaultBuilder() .UseContentRoot(AppContext.BaseDirectory) .UseSerilog() .UseWindowsLifetime() // 同步生命周期 .ConfigureServices((context, services) => { // 服务配置代码... }) .Build();
内容的提问来源于stack exchange,提问作者brainer33
相关产品推荐
相关产品推荐

