Должен ли я всегда добавлять CancellationToken к своим действиям контроллера? - PullRequest
0 голосов
/ 14 мая 2018

Является ли хорошей практикой всегда добавлять CancellationToken в мои действия независимо от того, длительная операция или нет?

В настоящее время я добавляю его к каждому действию, и я не знаю, правильно это или неправильно.

[Route("api/[controller]")]
public class DummiesController : Controller
{
    private readonly AppDbContext _dbContext;

    public DummyController(AppDbContext dbContext)
    {
        _dbContext = dbContext;
    }

    [HttpGet("{id}")]
    public async Task<ActionResult<Dummy>> GetAsync(int id, CancellationToken ct) // <<----- should I always do this?
    {
        var dummy = await _dbContext.Dummies.AsNoTracking().SingleOrDefaultAsync(e=>e.Id == id, ct);
        if (dummy == null) return NotFound();
        return dummy;
    }
}

Также необходимо добавить CancellationToken ct = default(CancellationToken)?

1 Ответ

0 голосов
/ 15 января 2019

Стоит добавить, если у вас есть какая-либо зависимость от внешнего ресурса.

Допустим, ваша база данных занята или у вас есть временные политики обработки ошибок / повторных попыток для вашего подключения к базе данных.Если конечный пользователь нажимает кнопку «Стоп» в своем браузере, токен отмены поможет корректно отменить все ожидающие операции (в вашем коде).

Меньше думайте об этом о длительной работе в нормальных условиях, но длительной работе вменее чем идеальные обстоятельства, например, если выполняется в Azure, а ваша база данных SQL проходит плановое обслуживание, а структура сущностей настроена на повторную попытку (при условии, что платформа Entity разумно реагирует на токены отмены).

В качестве примечания: структура устойчивости Pollyимеет отличную поддержку для внешних токенов отмены, чтобы координировать отмены повторов из внешнего отмены.Их вики стоит прочитать, так как они отлично подходят для координации отмены: https://github.com/App-vNext/Polly/wiki

Относительно CancellationToken ct = default(CancellationToken), это, вероятно, более полезно для библиотечного кода, чем для действия контроллера.Но удобно, если вы тестируете свой контроллер напрямую, но не хотите передавать токен отмены.Сказав, что WebHostBuilder testframework ядра .net легче тестировать, чем тестировать действия контроллера непосредственно в эти дни.

...