Blazor Wasm 每秒调用一次 SatehHasChanged。滞后

Blazor Wasm call SatehHasChanged every second. lagging

Parallel.Invoke(_po, async () => {
                while(!_viewModel.DisConnect)
                {
                    await _viewModel.SetThings();
                    await InvokeAsync(() => StateHasChanged());
                    Thread.Sleep(1000);
                }
            });

UI:

@foreach(var rsi in _viewModel.things)
    {
        <div class="row">
            <div class="col text-center">
                <span>Code: @things.Code</span>
            </div>
            <div class="col text-center">
                <span>value: @(Math.Truncate(things.Value * 10000) / 10000)</span>
            </div>
        </div>
    }

调用函数,每秒调用 sateHasChanged 进行更新 UI。 它落后了。当我悬停鼠标时,它会在 1~2 秒后做出反应。

如何在不滞后 blazor wasm 的情况下每秒更新 UI 数据?

代码正在阻塞自身。 Parallel.Invoke用于以blocking的方式并行执行多个操作,但问题的代码只有一个操作。这不比Task.Run(..).Wait()好。委托尝试使用 InvokeAsync() 调用已经阻塞的 UI 线程。然后冻结线程1秒。

使用简单的循环会更简单更好 Task.Delay() :

while(!_viewModel.DisConnect)
{
    await _viewModel.SetThings();
    StateHasChanged();
    await Task.Delay(1000);
}

更好的是,使用计时器:

_timer = new System.Threading.Timer(async _ =>
        {
            await _viewModel.SetThings();
            StateHasChanged();
        },null, 0, 1000);

要停止计时器,需要时调用Dispose()

_timer.Dispose();