在 Blazor Web 程序集中每秒调用 StateHasChanged() 是最佳的吗?

Posted

技术标签:

【中文标题】在 Blazor Web 程序集中每秒调用 StateHasChanged() 是最佳的吗?【英文标题】:Calling StateHasChanged() every second is optimal in blazor web assembly? 【发布时间】:2021-03-08 17:23:36 【问题描述】:

我正在开发一个blazor webassembly 应用程序。我需要在我的应用程序中显示当前的DateTime。以下是我使用纯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 来实现这个功能?请提出您的意见。

【问题讨论】:

【参考方案1】:

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

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

一些改进:

    System.Threading.Timer 是 IDisposable。您应该在此页面中实现 Dispose 逻辑。见this answer。

    您应该将回调设为async void,然后设为await InvokeAsync(StateHasChanged); 目前这对 WebAssembly 没有影响,但是有一天 Blazor/Wasm 将获得真正的线程,然后您的代码将失败。 Blazor/服务器已经需要 InvokeAsync()。

【讨论】:

以上是关于在 Blazor Web 程序集中每秒调用 StateHasChanged() 是最佳的吗?的主要内容,如果未能解决你的问题,请参考以下文章

可以使用 C# 的 Web 前端框架 Blazor

可以使用 C# 的 Web 前端框架 Blazor

可以使用 C# 的 Web 前端框架 Blazor

没有 Web 程序集的 blazor

如何使用 Blazor 创建独立的 Web 应用程序?

如何从 blazor(服务器端)Web 应用程序获取访问令牌?