我有一个需要几秒钟处理的方法。单击按钮时,我希望它更新 UI 以显示处理情况,然后在方法完成时更改 UI。作为示例,我采用了样板代码并将计数器单击修改为以下内容:
@page "/counter"
<h1>Counter</h1>
<p role="status">Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">@ButtonText</button>
@code {
private int currentCount = 0;
private string ButtonText = "Click";
private void IncrementCount()
{
ButtonText = "Running";
StateHasChanged();
currentCount++;
Thread.Sleep(1000);
ButtonText = "Click";
StateHasChanged();
}
}
我显然不明白线程处理什么的。在示例中,按钮文本不会更改。
运行 .NET 9 Maui Hybrid。
线程.睡眠(1000);
此调用会将当前线程(在本例中为 UI 线程)挂起指定的时间。这就是按钮文本永远不会更新为“正在运行”的原因。因为在 UI 更新之前,UI 线程会被 Thread.Sleep() 立即挂起。 如果您的目标是延迟执行特定时间,那么您应该使该方法异步并等待
Task.Delay() 调用,如下所示。
private async void IncrementCount()
{
ButtonText = "Running";
StateHasChanged();
currentCount++;
await Task.Delay(1000);
ButtonText = "Click";
StateHasChanged();
}