Попробовав себя на стороне сервера Blazor, я попытался применить свои прошлые знания, включая токены отмены для асинхронных операций, и не смог найти много информации о них в сочетании с Blazor.
Являются ли они по-прежнему лучшей практикой или в какой-то момент они устарели?
Я нашел ранее заданный вопрос, в котором рекомендуется создать источник токенов в методе OnInitializedAsync() и отменить его при Dispose (), что, честно говоря, кажется мне немного грубым.
(Мне нужно будет реализовать это для каждой страницы, и вы знаете... СУХОЙ)
Я также нашел эта статья о расширенных сценариях в Microsoft Docs, в которой объясняется, как реализовать обработчик цепей, что, честно говоря, сейчас немного выше моего понимания и, скорее всего, выходит за рамки моего маленького домашнего проекта.
Для сравнения, в asp.net Framework MVC я бы построил такой контроллер:
Код: Выделить всё
namespace SampleWebsite.Controllers
{
public class SampleController : ApiController
{
private readonly MyEntities _entities = new MyEntities();
public async Task MyAsyncApi(CancellationToken cancellationToken)
{
var result = _entities.MyModel.FirstOrDefault(e => e.Id == 1, cancellationToken: cancellationToken);
return OK(result);
}
}
}
Следовательно, если пользователь закрывает соединение, токен становится недействительным.
Я бы предположил, что для ядра asp.net и blazor, где инъекции зависимостей составляют большую часть, это будет иметь место и здесь, но я не смог найти любая документация по этому поводу здесь.
Итак, следует ли на этом этапе по-прежнему использовать токены отмены или Microsoft творит какую-то магию в фоновом режиме для асинхронных задач? И если да, то какая реализация будет лучшей?
РЕДАКТИРОВАТЬ:
Вот моя настройка, чтобы уточнить:
Компонент Blazor:
Код: Выделить всё
@page "/Index"
@inject IIndexService Service
@* Some fancy UI stuff *@
@code {
private IEnumerable _uiValues;
protected override async Task OnInitializedAsync()
{
_uiValues = await Service.FetchCostlyValues();
}
}
Код: Выделить всё
public interface IIndexService
{
Task FetchCostlyValues();
}
public class IndexService : IIndexService
{
public async Task FetchCostlyValues()
{
var uiValues = await heavyTask.ToListAsync(); //
Подробнее здесь: [url]https://stackoverflow.com/questions/62499939/cancellationtoken-in-blazor-pages[/url]
Мобильная версия