Blazor计时器每个用户会话一个实例

问题描述

我有一个Blazor服务器端应用程序,正在使用计时器检查用户的新消息并在收到新消息时显示消息。这是我的代码

private string hasMsg { get; set; }
private System.Threading.Timer _timer;

protected override async Task OnAfterRenderAsync(bool firstRender)
{
    if (firstRender)
    {
        if (_timer == null)
        {
            _timer = new System.Threading.Timer((_) =>
            {
                InvokeAsync(async () =>
                {
                    hasMsg = await GetValue();
                    StateHasChanged();
                });
            },null,30000);//every 30 seconds
        }
    }
}

GetValue()函数只是调用一个API。

最初效果很好。但是,每当刷新浏览器时,都会实例化一个新的计时器实例,并且每30秒将调用一次API。我认为这很有意义,因为刷新浏览器时,整个页面都会重新呈现。那么如何确保处置以前的计时器或不启动新的计时器实例并重新使用已经运行的实例呢?

请记住,我需要让应用程序的每个用户都拥有自己的计时器。 API调用接收特定于用户的信息。谢谢!

解决方法

如果要在页面刷新时停止计时器,则应执行以下操作:

您需要致电createMany()停止计时器。

该位置将位于_timer.Dispose中的Dispose方法中。

因此使用计时器的组件应实现IDisposable,并在覆盖的IDisposable方法中调用Dispose