【发布时间】: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()。查看链接。