Blazor组件必须实现IDisposable以释放非托管资源,如Timer、事件订阅、WebSocket等;应在Dispose()中判空调用Dispose(),避免StateHasChanged()和await异步操作。

Blazor 组件实现 IDisposable 是为了在组件被销毁前及时释放非托管资源(如定时器、事件订阅、HTTP 客户端连接、WebSocket 等),避免内存泄漏或后台任务持续运行。
什么时候必须实现 IDisposable
当组件中持有以下资源时,应显式实现 IDisposable:
- 启动了
System.Threading.Timer或Task.Run启动的长期运行后台任务 - 手动订阅了静态事件或跨组件生命周期的事件(如
HttpClient.DefaultRequestHeaders变更、自定义事件总线) - 使用了未被 Blazor 生命周期自动管理的
Stream、DbContext(非 Scoped 服务)、WebSocket等 - 通过
@ref持有原生 JS 对象且需调用 JS cleanup 函数(配合IJSRuntime)
正确实现 Dispose 方法
在组件类中实现 IDisposable 接口,并在 Dispose() 中执行清理逻辑。注意:Blazor Server 和 WebAssembly 均支持该接口,但触发时机一致——组件从渲染树移除时(例如导航离开、条件渲染为 false)。
推荐写法:
@implements IDisposable
<p>@code {
private Timer? _timer;
private IDisposable? _subscription;</p><pre class="brush:php;toolbar:false;">protected override void OnInitialized()
{
_timer = new Timer(_ => { /* do work */ }, null, TimeSpan.Zero, TimeSpan.FromSeconds(5));
_subscription = SomeEventBus.Subscribe<Message>(HandleMessage);
}
public void Dispose()
{
_timer?.Dispose();
_subscription?.Dispose();
// 其他清理...
}登录后复制
}
标签: js websocket ai stream .net
还木有评论哦,快来抢沙发吧~