Подтвердить что ты не робот

Должны ли мы использовать 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 в контроллерах или нет (и почему).

4b9b3361

Ответ 1

Вы должны использовать его. Сейчас он применяется только если у вас есть AsyncTimeout, но вероятно, что будущая версия MVC/WebAPI будет интерпретировать токен как "либо тайм-аут, либо клиент отключен",.

Ответ 2

Вы можете использовать этот

public async Task<ActionResult> MyReallySlowReport(CancellationToken cancellationToken)
    {
        CancellationToken disconnectedToken = Response.ClientDisconnectedToken;
        using (var source = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, disconnectedToken))
        {

            List<ReportItem> items;
            using (ApplicationDbContext context = new ApplicationDbContext())
            {
                items = await context.ReportItems.ToListAsync(source.Token);
            }
            return View(items);
        }
    }

взято из здесь