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

Blazor WebAssembly中替代IHostApplicationLifetime的应用终止CancellationToken方案

在Blazor WebAssembly中实现类似IHostApplicationLifetime.ApplicationStopping的终止信号

问题:在Blazor WebAssembly中,是否存在类似IHostApplicationLifetime.ApplicationStopping、可标识整个应用终止的CancellationToken?若没有内置实现,最佳替代实践是什么?

首先明确:Blazor WebAssembly 并没有内置和 ASP.NET Core 中 IHostApplicationLifetime.ApplicationStopping 完全对等的原生取消令牌。毕竟WASM应用的生命周期绑定在浏览器标签页/窗口上,没有后端那样的主机托管生命周期机制。

最佳替代实践

1. 监听浏览器全局事件

可以通过监听浏览器的beforeunload或unload事件来捕获应用即将终止的信号,示例代码如下:

window.addEventListener('beforeunload', (event) => {
    // 通知Blazor应用即将终止
    DotNet.invokeMethodAsync('YourAssemblyName', 'OnApplicationStopping');
});

不过要注意,浏览器对这两个事件的执行逻辑有严格限制,比如不允许执行长时间同步操作,部分浏览器可能会拦截弹窗类交互。

2. 基于根组件生命周期的自定义取消令牌(你最终采用的方案)

这是更贴合Blazor组件模型的方案,核心是利用根组件(App.razor)的销毁时机触发自定义CancellationTokenSource,具体实现步骤:

第一步:定义全局生命周期服务
public interface IAppLifetime
{
    CancellationToken ApplicationStopping { get; }
}

public class AppLifetime : IAppLifetime
{
    private readonly CancellationTokenSource _cts = new();
    public CancellationToken ApplicationStopping => _cts.Token;

    public void TriggerApplicationStopping()
    {
        _cts.Cancel();
        _cts.Dispose();
    }
}
第二步:在Program.cs中注册服务
builder.Services.AddSingleton<IAppLifetime, AppLifetime>();
第三步:在根组件App.razor中触发信号
@implements IDisposable
@inject IAppLifetime AppLifetime

<!-- 你的组件内容 -->

@code {
    public void Dispose()
    {
        // 组件销毁时(对应应用终止)触发取消信号
        AppLifetime.TriggerApplicationStopping();
    }
}

之后你就可以在任意组件或服务中注入IAppLifetime,通过ApplicationStopping令牌监听应用终止事件,执行清理逻辑:

public class SomeService
{
    private readonly IAppLifetime _appLifetime;

    public SomeService(IAppLifetime appLifetime)
    {
        _appLifetime = appLifetime;
        // 注册终止时的回调
        _appLifetime.ApplicationStopping.Register(() =>
        {
            // 执行清理操作,比如取消未完成的网络请求
        });
    }
}

这种方案的优势在于完全适配Blazor的组件生命周期,能准确捕获应用的销毁时机(用户关闭标签页、刷新页面、导航离开都会触发根组件的Dispose),是目前WASM场景下最可靠的实现方式。

内容的提问来源于stack exchange,提问作者ZorgoZ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 21:06:07