在 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() 是最佳的吗?的主要内容,如果未能解决你的问题,请参考以下文章