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

Blazor Server中单例观察者模式页面刷新后引用未释放的内存泄漏问题咨询

Blazor Server中单例观察者模式页面刷新后引用未释放的内存泄漏问题咨询

我在Blazor Server应用中使用单例服务来在订单变化时通知组件。该服务遵循观察者模式,页面会注册事件处理器,在更新发生时触发。

public class OrderOnChangeService : IOrderOnChangeService
{
    public event Action<List<int>, Guid>? OnOrderRowChanged;

    public void NotifyOrderRowChanged(List<int> orderIds, Guid changeId)
    {
        OnOrderRowChanged?.Invoke(orderIds, changeId);
    }

    public int GetObserverCount()
    {
        return OnOrderRowChanged?.GetInvocationList().Length ?? 0;
    }
}

在我的Blazor组件(.razor.cs)中,我向这个服务注册了一个方法:

protected override async Task OnInitializedAsync()
{
    OrderOnChangeService.OnOrderRowChanged += HandleRowChanged;
    Console.WriteLine($"Registered: {OrderOnChangeService.GetObserverCount()} observers");
}

public void Dispose()
{
    OrderOnChangeService.OnOrderRowChanged -= HandleRowChanged;
    Console.WriteLine($"Disposed: {OrderOnChangeService.GetObserverCount()} observers");
}

private void HandleRowChanged(List<int> orderIds, Guid changeId)
{
    // 处理更新逻辑
}

当我刷新页面时,Blazor电路会终止,但由于OrderOnChangeService是单例,它仍然持有已释放页面实例的处理器引用。这似乎会导致内存泄漏,因为事件引用永远不会被移除,除非显式调用Dispose方法。

如何确保Blazor页面刷新时事件处理器总是被移除,这样单例服务就不会保留过时的引用?


备注:内容来源于stack exchange,提问作者AtomicallyBeyond

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 10:09:30