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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 21:12:04