Blazor服务器端-使用StateHasChanged循环进行实时更新

时间:2020-03-29 14:18:00

标签: c# blazor

此刻,我在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());
            }
        }
    }
}

因此,请确保通过一次会话即可在我的本地环境中正常工作。但这在野外负载情况下将如何执行?

1 个答案:

答案 0 :(得分:2)

StateHasChanged,无论是在服务器还是浏览器上,都将重新呈现当前组件/页面及其所有子代(等)。

将结果渲染到内存中的虚拟DOM,然后与上一渲染的虚拟DOM进行比较。如果有任何更改,它将为客户端呈现html增量。

答案是,它可能很少向浏览器发送html,但是服务器将为每个用户每秒在内存中呈现页面60次。

这根本无法很好地扩展。使用Reactive库将数据从源推送到UI会更好。这样,它将仅在需要时呈现,并且您的UI将立即更新。

请参见https://blazor-university.com/overview/blazor-hosting-models/

还有https://blazor-university.com/components/render-trees/