Blazor如何在离开Razor组件页面时停止运行中的Timer定时器
解决方案
- 首先将Timer从方法局部变量提升为类级别的私有字段,保证组件生命周期内都能访问到该实例。
- 让你的Razor组件实现
IDisposable接口,Blazor会在组件被从渲染树移除、导航离开当前页面时自动调用Dispose方法,这就是对应组件卸载的生命周期钩子。 - 在
Dispose方法中停止并释放Timer资源,同时可增加销毁标记位,避免Timer回调在组件销毁后仍然执行,引发异常或无效的接口请求。
修改后的完整代码示例:
// 组件类需要实现IDisposable接口 public partial class YourComponent : ComponentBase, IDisposable { private IEnumerable<InterfaceConnection> _interfaceConnections; private Timer _timer; // 定义为类级字段 private bool _isDisposed; // 销毁标记位 protected override async Task OnInitializedAsync() { _interfaceConnections = await _client.GetAllInterfaceConnections(); _timer = new Timer(); _timer.Elapsed += new ElapsedEventHandler(UpdateConnections); _timer.Interval = 500; _timer.Enabled = true; } private async void UpdateConnections(object source, ElapsedEventArgs e) { // 组件已销毁则直接返回,不执行后续逻辑 if (_isDisposed) return; _interfaceConnections = await _client.GetAllInterfaceConnections(); await InvokeAsync(StateHasChanged); } // 实现Dispose方法 public void Dispose() { _isDisposed = true; // 释放Timer,自动停止计时并清理资源 _timer?.Dispose(); } }
如果是.NET 5+的Blazor版本,也可以选择实现IAsyncDisposable接口处理异步释放逻辑,效果一致。
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

