首页 > 解决方案 > 在 Blazor Web 程序集中每秒调用 StateHasChanged() 是最佳的吗?

问题描述

我正在开发一个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();
    }
}

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

标签: c#asp.net-coreblazorblazor-client-sideblazor-webassembly

解决方案


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

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

一些改进:

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

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


推荐阅读