c# - Blazor 服务器:手动刷新重新呈现的 UI
问题描述
在计数器示例中,我添加了一个计时器来增加计数器:
@page "/counter"
<h1>Counter</h1>
<p>Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@code {
private int currentCount = 0;
protected override void OnInitialized()
{
var timer = new System.Timers.Timer();
timer.Interval = TimeSpan.FromSeconds(1).TotalMilliseconds;
timer.Elapsed += (s, e) =>
{
IncrementCount();
StateHasChanged();
};
timer.Start();
}
private void IncrementCount()
{
currentCount++;
}
}
此代码与 Blazor WebAssembly 一起使用,计数器递增并且 UI 显示新值。但是对于 Blazor Server,计数器会增加(在调试器中检查),但 UI 不会刷新。
如何使用 Blazor Server 手动刷新 UI?
解决方案
与在可用的单个 JavaScript UI 线程下执行的 Blazor WebAssembly App 不同,Blazor Server App 可能对同一个应用程序使用多个线程,其结果会导致同步上下文出现问题。
你需要的是同步上下文的调整。就代码而言,您应该执行以下操作:
InvokeAsync(() => StateHasChanged()); instead of merely calling `StateHasChanged();`
请注意,您经常会遇到此异常,具体取决于您的代码设计:
System.InvalidOperationException: '当前线程与渲染器的同步上下文无关。在触发渲染或修改渲染期间访问的任何状态时,使用 Invoke() 或 InvokeAsync() 将执行切换到渲染器的同步上下文。
希望这可以帮助。
推荐阅读
- java - 在 Flux 中组合两个连续的元素
- swift - 如何在 Reality Composer 上安装手势
- google-apps-script - 尝试使用谷歌脚本编辑器在谷歌表格中获取日期格式以显示为具有相关后缀的第一、第二、第三等
- java - Jackson - 为 Map 键包含 JsonTypeInfo
- c# - Mongo 抛出并发会话的写冲突
- flutter - 用于空值的空检查运算符 - StaggeredGridView
- mongodb - 使用聚合从输入中获取数组
- python - 如果变量不同,R 和/或 Pandas-Python 函数可根据条件创建新变量
- c# - Xamarin 表单 WebAuthenticator 使用
- php - PHPMailer 和附件在打开时无法正确显示