【发布时间】:2020-03-30 16:16:03
【问题描述】:
目前,我在 Blazor 服务器页面上使用无限循环(有延迟)来更新我的 UI。
<div>
@for (int i = 0; i < GlobalData.Length; i++)
{
@GlobalData[i]
}
<div>
@code {
public CancellationTokenSource CancellationTokenSource { get; set; }
protected override void OnInitialized()
{
CancellationTokenSource = new CancellationTokenSource();
RealTimeUpdate(CancellationTokenSource.Token);
}
public async Task RealTimeUpdate(CancellationToken cancellationToken)
{
while(!cancellationToken.IsCancellationRequested)
{
await Task.Delay(TimeSpan.FromMilliseconds(1000 / 60), cancellationToken);
if(!cancellationToken.IsCancellationRequested)
{
InvokeAsync(() => this.StateHasChanged());
}
}
}
}
因此,请确保在我的本地环境中使用单个会话可以正常工作。但是这在野外负载下会如何表现呢?
【问题讨论】:
-
IMO 它对于 blazor 服务器应用程序来说看起来不错,因为它使用 SignalR
-
你应该使用
ConfigureAwait(false):await Task.Delay(TimeSpan.FromSeconds(1000 / 60), cancellationToken).ConfigureAwait(false); -
你能解释一下你的代码的使用案例吗?这是一个游戏循环或类似的东西?我在 Flappy Blazor Bird 上使用它:github.com/ctrl-alt-d/FlappyBlazorBird/blob/master/src/…,但通过事件刷新每个用户 UI。
-
@aguafrommars 没有
SynchronizationContext,所以ConfigureAwait(false)不会有任何区别。 -
旁注:
1000 / 60是 16。你想要1000.0 / 60.0,或者至少是1000 / 60.0。也不需要1000毫秒,那只是一秒。我会把它写成const int fps = 60; TimeSpan.FromSeconds(1.0 / fps);