You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在应用退出时执行代码?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 17:05:23