Самые Частые Ошибки при Работе с async/await. Продолжение 11-13
Начало
Часть 2
Часть 3
11. Передача токена отмены
Если вы забудете передать токен отмены, это может привести к большим проблемам. Запущенная длительная операция без токена отмены может заблокировать действие по остановке приложения или привести к нехватке потоков при большом количестве отменённых веб-запросов. Чтобы избежать этого, всегда создавайте и передавайте токен отмены методам, которые его принимают, даже если это необязательный параметр.
❌ Неверно
public async Task<string>✅ Верно
GetSomething(HttpClient http) {
var response = await
http.GetAsync(new Uri("/endpoint/"));
return await
response.Content.ReadAsStringAsync();
}
public async Task<string>12. Использование токена отмены с IAsyncEnumerable
GetSomething(HttpClient http,
CancellationToken ct) {
var response = await
http.GetAsync(new Uri("/endpoint/"),
ct);
return await
response.Content.ReadAsStringAsync();
}
Эта ошибка похожа на предыдущую, но относится исключительно к
IAsyncEnumerable и её довольно легко допустить. Это может быть неочевидно, но передача токена отмены в асинхронный перечислитель выполняется путем вызова метода WithCancellation().❌ Неверно
async Task Iterate(✅ Верно
IAsyncEnumerable<string> e) {
await foreach (var item in e) {
…
}
}
async Task Iterate(13. Имена асинхронных методов должны заканчиваться на Async
IAsyncEnumerable<string> e,
CancellationToken ct) {
await foreach (var item in
e.WithCancellation(ct))
{
…
}
}
И наоборот, имена синхронных методов не должны заканчиваться на
Async. Так обычно происходит при невнимательном рефакторинге. Это не строгое обязательство и не ошибка. Вообще, это соглашение об именовании имеет смысл только тогда, когда класс предоставляет как синхронные, так и асинхронные версии метода.❌ Неверно
async Task DoSomething() {
await Task.Yield();
}
✅ Верноasync Task DoSomethingAsync() {
await Task.Yield();
}
Продолжение следует…Источник: https://cezarypiatek.github.io/post/async-analyzers-p2/