【问题标题】:Blazor Timer One Instance Per User SessionBlazor 计时器每个用户会话一个实例
【发布时间】:2020-12-03 14:19:18
【问题描述】:

我有一个 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, 0, 30000);//every 30 seconds
        }
    }
}

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

这最初运作良好。但是,每当我刷新浏览器时,都会实例化一个新的计时器实例,并且每 30 秒将调用两次 API。我想这是有道理的,因为当刷新浏览器时,整个页面都会重新呈现。那么如何确保前一个定时器被释放或不启动一个新的定时器实例并重新使用已经运行的定时器呢?

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

【问题讨论】:

  • 你已经有了答案:stackoverflow.com/a/63062755
  • 你为什么调用() GetValue() ?
  • @HenkHolterman 我不确定,但如果StateHasChanged 不在InvokeAsync 内,也许你不能打电话?
  • 是的,您应该调用 StateHasChanged()。但不是潜在的缓慢 GetValue()。查看链接。

标签: blazor blazor-server-side


【解决方案1】:

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

您需要致电_timer.Dispose 来停止计时器。

该位置将在来自IDisposableDispose 方法中。

所以使用定时器的组件应该实现IDisposable,并在重写的Dispose方法中调用_time.Dipose()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-25
    • 2014-02-21
    • 2013-01-17
    • 2011-10-27
    • 1970-01-01
    • 2012-11-16
    • 2015-12-26
    • 2019-10-19
    相关资源
    最近更新 更多