Следует ли использовать 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/