Стоит ли перегружать асинхронные методы с CancellationToken?

Введение

Я знаю, что раньше в C# было принято все асинхронные методы, что возвращают Task, перегружать с токеном отмены. Приведу для примера класс TcpClient:

public Task ConnectAsync(string host, int port);
public ValueTask ConnectAsync(string host, int port, CancellationToken cancellationToken);

Но в .NET 6.0 появился метод WaitAsync, который позволяет дождаться задачу с токеном отмены.

Вопрос

Актуален ли ещё паттерн перегрузки метода с CancellationToken, и если да, то чем это лучше .WaitAsync(...)?


Ответы (1 шт):

Автор решения: Pavel Mayorov

Принципиальная проблема метода Task.WaitAsync - в том, что он отменяет ожидание, но не отменяет задачу. Ваша задача всё равно выполнится до конца, просто вы не обязательно этого момента дождётесь.

Для экономии ресурсов надо передавать токен отмены так глубоко, как только можно, и не надеяться на костыли вроде WaitAsync.

Кстати, перегрузка всё же необязательная, но по другой причине - в свежем коде всегда можно использовать параметры по умолчанию:

public ValueTask ConnectAsync(string host, int port, CancellationToken cancellationToken = default) {
  // …
}
→ Ссылка