Прожив под камнем в течение 2 лет, я столкнулся с Blazor на моем новом рабочем месте, и мне нужно много наверстать после того, как я в основном выполнял MVC ASP.NET Framework до 2 лет.
Пробуя себя на стороне сервера 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<IHttpActionResult> MyAsyncApi(CancellationToken cancellationToken)
{
var result = _entities.MyModel.FirstOrDefault(e => e.Id == 1, cancellationToken: cancellationToken);
return OK(result);
}
}
}
CancellationToken будет внедрен asp.net Framework / Core и напрямую связан с текущим каналом подключения контекста. Следовательно, если пользователь закрывает соединение, токен становится недействительным.
Я бы предположил, что для asp.net core и blazor, где инъекции зависимостей составляют большую часть, это будет иметь место и здесь, но я не смог найти здесь никакой документации по этому поводу.
Итак, следует ли на этом этапе по-прежнему использовать токены отмены или Microsoft творит чудеса в фоновом режиме для асинхронных задач? И если да, то какая реализация будет лучшей?
РЕДАКТИРОВАТЬ: Вот мои настройки, чтобы уточнить:
Компонент Blazor:
@page "/Index"
@inject IIndexService Service
@* Some fancy UI stuff *@
@code {
private IEnumerable<FancyUiValue> _uiValues;
protected override async Task OnInitializedAsync()
{
_uiValues = await Service.FetchCostlyValues();
}
}
И внедренный сервис-класс, который делает тяжелую работу:
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;
}
}
Мой вопрос: как лучше всего получить токен в определенной части кода или это не имеет значения, потому что сервер убьет все запущенные задачи, когда соединение (например) завершится?