async-await - 页面加载时的 Blazor 和 ContinueWith

标签 async-await parallel-processing blazor blazor-server-side

我是 Blazor 的新手。我正在开发服务器应用程序(不是 WASM)。

在页面加载时,我正在向页面加载 2 个内容。 Item1 通过 API 调用与 Item2 同时加载。我希望个别商品一有货就显示出来。我在想类似的事情

protected override async Task OnInitializedAsync()
{
    var t1 = _service.GetItem1().ContinueWith(t => {
        Item1Loaded = true;
        Item2State = t.Result;
        await InvokeAsync(StateHasChanged);
    });

    var t2 = _service.GetItem2().ContinueWith(t => {
        Item2Loaded = true;
        Item2State = t.Result;
        await InvokeAsync(StateHasChanged);
    });
}

我对此有几个问题:

  1. 如果用户离开组件,我是否需要担心取消这些行? (在删除组件后更改状态变量是否会导致问题)或者 Blazor 是否以某种方式在框架级别处理该问题?
  2. 我是否需要确保它返回到具有同步上下文的特定线程?似乎 InvokeAsync 只是为我做了这件事,但我想确定一下。
  3. 很难找到很多 ContinueWith 的现代例子。 async/await 占主导地位,但我认为它不允许延续按完成顺序执行。这是对它的合理使用吗?

最佳答案

由于您使用的是服务器端,因此您可以更干净地执行此操作(自 async/await 以来,ContinueWith 或多或少已过时):

protected override async Task OnInitializedAsync()
{
    var t1 = Task.Run(async () => 
      { Item1State = await _service.GetItem1(); 
        Item1Loaded = true; // you can probably derive this from Item1State
        await InvokeAsync(StateHasChanged);
      });

    var t2 = Task.Run(async () => 
      { Item2State = await _service.GetItem2();
        Item2Loaded = true;           
        await InvokeAsync(StateHasChanged);
      });

   await Task.WhenAll(t1, t2);
}

这里不需要调用StateHasChanged()。

如果没有 ItemLoaded 守卫,您可以在没有 Task.Run() 的情况下执行此操作。

关于async-await - 页面加载时的 Blazor 和 ContinueWith,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73990718/

相关文章:

javascript - 为什么我的 JavaScript 函数只在调试中找不到?

c# - 不抛出警告的 Task.Run 的替代方案

rust - 如何传递包含作为引用的参数的异步回调?

c# - 当内部调用不是自然异步时,如何创建自然异步方法?

c++ - 我可以/应该在 GPU 上运行此统计应用程序的代码吗?

signalr - 发布到 Azure 后的 Azure SignalR 服务 403

python - python 中循环中的一个等待和任务

multithreading - 互斥锁是如何工作的?互斥锁是否全局保护变量?定义它的范围重要吗?

macos - Grand Central Dispatch 与 Cilk++

c# - 在客户端 wasm 代码中包含密码是否安全?