gpt4 book ai didi

c# - Blazor 页面中的 CancellationToken?

转载 作者:行者123 更新时间:2023-12-04 12:58:37 26 4
gpt4 key购买 nike

在工作明智地生活了 2 年之后,我现在在我的新工作场所遇到了 Blazor,并且在 2 年之前主要完成了 ASP.NET Framework MVC 之后,我有很多事情要做。
在 Blazor 服务器端尝试自己,我尝试应用我过去的知识,其中包括用于异步操作的取消 token ,但我无法找到关于它们与 Blazor 结合的太多信息。
它们仍然是最佳实践还是在某个时候变得过时了?
我确实找到了 this previously asked question建议在 OnInitializedAsync() 上创建 token 源方法并在 Dispose() 上取消它老实说,我觉得这有点粗糙。
(我需要为每个页面实现这个,你知道......干)
我还找到了 this Article about advanced Scenarios on Microsoft Docs这解释了如何实现电路处理程序,老实说,它现在有点超出我的范围,而且很可能超出了我的小家庭项目的范围。
相比之下,在 asp.net Framework MVC 中,我会像这样构建一个 Controller :

namespace SampleWebsite.Controllers
{
public class SampleController : ApiController
{
private readonly MyEntities _entities = new MyEntities();

public async Task<IHttpActionResult> MyAsyncApi(CancellationToken cancellationToken)
{
var result = _entities.MyModel.FirstOrDefault(e => e.Id == 1, cancellationToken: cancellationToken);
return OK(result);
}
}
}
CancellationToken 将由asp.net Framework/Core 注入(inject)并直接链接到当前上下文连接管道。
因此,如果用户关闭连接, token 将无效。
我会假设对于 asp.net core 和 blazor,其中依赖注入(inject)是其中的重要组成部分,这里也是这种情况,但我在这里找不到任何关于此的文档。
那么,此时是否应该继续使用取消 token ,还是微软在后台为异步任务做了一些魔法?如果是,最好的实现是什么?
编辑:
这是我要澄清的设置:
Blazor 组件:
@page "/Index"
@inject IIndexService Service

@* Some fancy UI stuff *@

@code {
private IEnumerable<FancyUiValue> _uiValues;

protected override async Task OnInitializedAsync()
{
_uiValues = await Service.FetchCostlyValues();
}
}
以及完成繁重工作的注入(inject)服务级:
public interface IIndexService
{
Task<IEnumerable<FancyUiValue>> FetchCostlyValues();
}

public class IndexService : IIndexService
{
public async Task<IEnumerable<FancyUiValue>> FetchCostlyValues()
{
var uiValues = await heavyTask.ToListAsync(); // <-- Best way to get a cancellationtoken here?
return uiValues;
}
}
我的问题是,在代码的特定部分获取 token 的最佳方法是什么,还是无关紧要,因为服务器会在连接(例如)结束时终止所有正在运行的任务?

最佳答案

CancellationToken 是服务器上的最佳实践,但您通常不需要在 UI 层中使用。
您链接到的问题讨论了“长时间运行的后台任务”,在需要时不应将其作为 UI 层的一部分。
当您确实需要 token 时,然后使用 using(...) {...} 创建一个源围绕那个具体的行动。源的生命周期与您的页面的生命周期无关,因此页面 Dispose() 不是正确的位置。

您自己的示例案例:

protected override async Task OnInitializedAsync()
{
_uiValues = await Service.FetchCostlyValues();
}
这将成功或抛出异常。 cancelToken 的唯一用途是具有超时限制。
protected override async Task OnInitializedAsync()
{
using (var source = new CancelationTokenSource(100))
{
_uiValues = await Service.FetchCostlyValues(source.Token);
}
}

or does Microsoft do some magic in the background for asynchronous tasks?


不。

关于c# - Blazor 页面中的 CancellationToken?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62499939/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com