Следует ли использовать CancellationToken с контроллерами MVC / Web API?
существуют различные примеры для асинхронных контроллеров. Некоторые из них используют CancellationToken в определении метода:
public async Task<ActionResult> ShowItem(int id, CancellationToken cancellationToken)
{
await Database.GetItem(id, cancellationToken);
...
но другие примеры и даже значение по умолчанию ASP.NET проекты для VS2013 вообще не используют CancellationToken и работают без него:
public async Task<ActionResult> ShowItem(int id)
{
await Database.GetItem(id);
...
неясно, следует ли использовать CancellationToken в контроллерах или нет (и почему).
3 ответов
вы должны использовать его. Прямо сейчас это применимо только Если у вас есть AsyncTimeout
, но вполне вероятно, что будущая версия MVC/WebAPI будет интерпретировать токен как "либо timeout или клиент отключен".
вы можете использовать этот
public async Task<ActionResult> MyReallySlowReport(CancellationToken cancellationToken)
{
CancellationToken disconnectedToken = Response.ClientDisconnectedToken;
using (var source = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, disconnectedToken))
{
IEnumerable<ReportItem> items;
using (ApplicationDbContext context = new ApplicationDbContext())
{
items = await context.ReportItems.ToArrayAsync(source.Token);
}
return View(items);
}
}
принято от здесь.
пользователи могут отменить запросы к вашему веб-приложению в любой момент, нажав кнопку "стоп" или "перезагрузить" в вашем браузере. Как правило, ваше приложение будет продолжать генерировать ответ в любом случае, даже если Kestrel не отправит его пользователю. Если у вас есть метод длительных действий, вы можете определить, когда запрос отменен, и остановить выполнение.
вы можете сделать это, введя CancellationToken в метод действия, который будет автоматически привязан к Свойство HttpContext.Маркер RequestAborted для запроса. Вы можете проверить этот маркер на отмену, как обычно, и передать его любым асинхронным методам, которые его поддерживают. Если запрос отменен, будет создано исключение OperationCanceledException или TaskCanceledException.
Ниже ссылка подробно объясняет этот сценарий.
https://andrewlock.net/using-cancellationtokens-in-asp-net-core-mvc-controllers/