在 blazor Web 程序集中每秒调用 StateHasChanged() 是最佳选择吗?

fin*_*s10 6 c# asp.net-core blazor blazor-client-side blazor-webassembly

我正在开发一个blazor webassembly应用程序。我需要DateTime在我的应用程序中显示当前内容。这是我如何用 pure 实现我的要求C#

@using System.Threading

<p>@CurrentDateTime</p>

@code {
    protected override void OnAfterRender(bool firstRender)
    {
        if (firstRender)
        {
            new Timer(DateTimeCallback, null, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1));
        }
    }

    private void DateTimeCallback(object state)
    {
        CurrentDateTime = DateTimeOffset.UtcNow.ToString("dd MMM yyyy hh:mm:ss tt");
        StateHasChanged();
    }
}
Run Code Online (Sandbox Code Playgroud)

这给出了准确的当前时间并每秒更新一次。但我有点担心StateHasChanged()每秒都打电话。从长远来看,它会影响性能吗?或者我需要回退javascript才能实现此功能?请提出您的意见。

Hen*_*man 5

但我有点担心每秒调用 StateHasChanged() 。

别这样。每一毫秒都可能是个问题,每一秒都应该没问题。

一些改进:

  1. System.Threading.Timer 是 IDisposable。您应该在此页面中实现 Dispose 逻辑。看到这个答案

  2. 您应该将回调设置为 an async void,然后await InvokeAsync(StateHasChanged); 这在目前的 WebAssembly 中没有什么区别,但有一天 Blazor/Wasm 将获得真正的线程,然后您的代码将失败。Blazor/服务器已经需要 InvokeAsync()。