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();
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();