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
相关产品推荐
相关产品推荐

