我是 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);
});
}
我对此有几个问题:
- 如果用户离开组件,我是否需要担心取消这些行? (在删除组件后更改状态变量是否会导致问题)或者 Blazor 是否以某种方式在框架级别处理该问题?
- 我是否需要确保它返回到具有同步上下文的特定线程?似乎
InvokeAsync
只是为我做了这件事,但我想确定一下。 - 很难找到很多
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/