在 Blazor 中延迟任务而不阻塞 UI

Fra*_*llo 7 asp.net-core blazor blazor-server-side

我在 Blazor 中创建了一个 .razor 通知组件,我试图在 xx 秒后自动关闭通知 div。

到目前为止,它适用于这种方法

 private async Task CloseToast(Guid Id, bool autoclose = false)
{
    if (autoclose)
    {
        await Task.Delay(TimeSpan.FromSeconds(5));
    }

   //Code to remove the notification from list
    StateHasChanged();
}
Run Code Online (Sandbox Code Playgroud)

问题是 UI 数据绑定卡住了 5 秒钟,任何一种或两种方式绑定更新到变量(文本字段等)都被暂停,直到通知关闭并且任务恢复。

如何在 xx 秒后启动方法或代码块而不阻塞 Blazor 中的主 UI 任务?

Zso*_*des 16

带有倒计时计时器的组件


<h3>@Time</h3>

@code {
    [Parameter] public int Time { get; set; } = 5;

    public async void StartTimerAsync()
    {
        while (Time > 0)
        {
            Time--;
            StateHasChanged();
            await Task.Delay(1000);
        }
    }

    protected override void OnInitialized()
        => StartTimerAsync();
}
Run Code Online (Sandbox Code Playgroud)

用法:

<Component />
<Component Time="7"/>
Run Code Online (Sandbox Code Playgroud)

在客户端 Blazor 上测试。在服务器端 Blazor 中的行为方式应该相同。希望这可以帮助

  • 方法签名中的“async void”造成了差异。```async void``` 基本上是即发即忘,而 ```async Task``` 将等待整个任务完成。另一种选择是使用 System.Timer.Timer 类以相同的“async void”方式而不是 while 循环。 (5认同)
  • 我不明白。有什么不同?为什么OP的代码会阻塞而你的却不会? (2认同)