一、执行过程中,要刷新 进度条 的显示,需要 延时、释放,否则进度条不 实时 更新,最后一下到 100%
// 延时,释放给前端:【必须】,否则进度条不 实时 更新,最后一下到 100
await Task.Delay(1);
二、执行过程中,需要 通知 Blazor 更新 UI,否则不 实时 更新
// 通知 Blazor 更新 UI:【必须】,否则不 实时 更新
StateHasChanged();
三、如果是单击执行,执行过程中,应该禁用 按钮,防止没有执行完毕就再次进入
// 禁用按钮
IsButtonDisabled = true;
四、示例程序
@page "/progress-demo"
<h3>进度条示例</h3>
<br />
<button @onclick="StartCalculation" disabled="@IsButtonDisabled">开始计算</button>
<br />
<br />
<progress value="@progressValue" max="100"></progress>
<p>进度: @progressValue%</p>
@code {
private bool IsButtonDisabled { get; set; } = false;
// 模拟 费时 计算
void Calculation()
{
double d = 1.1;
for (int i = 0; i < 1000000; i++)
{
d *= 9.9;
}
}
// 进度条数值变量
private int progressValue = 0;
private async Task StartCalculation()
{
// 禁用按钮
IsButtonDisabled = true;
// 重置进度条
progressValue = 0;
// 开始 多次 费时 操作
for (int i = 1; i <= 1000; i++)
{
// 这儿时 具体 费时 操作代码
Calculation();
// 更新一次进度条
if (i % 10 == 0)
{
// 更改进度条数值
progressValue++;
// 输出到 Console 观察实际进度
System.Console.WriteLine($"progressValue = {progressValue}, i = {i}");
// 延时,释放给前端:【必须】,否则进度条不 实时 更新,最后一下到 100
await Task.Delay(1);
// 通知 Blazor 更新 UI:【必须】,否则不 实时 更新
StateHasChanged();
}
}
// 计算完成,确保 进度条 设置为 100%
progressValue = 100;
// 重新启用按钮
IsButtonDisabled = false;
await Task.FromResult(true);
}
}