Как запустить асинхронную задачу Task на n секунд?

Доброго времени суток!

Мне требуется асинхронно запустить некоторую задачу System.Threading.Tasks.Task, но проблема в том, что она никогда не завершается, и мое приложение навсегда зависает в режиме ожидания ее выполнения.

Говоря конкретно, я работал с классом SslStream. На клиентском приложении я запускаю асинхронную операцию аутентификации (await) stream.AuthenticateAsClientAsync(null). Сервер тут же отклоняет ее (проблема с сертификацией), а запущенная асинхронная операция, как оказалось, может провисеть бесконечно долго. В итоге мое клиентское приложение не может продолжать работу.

Вопрос: Как мне асинхронно запустить задачу System.Threading.Tasks.Task так, чтобы она была отменена через, например, 10 секунд?

Да, я вижу эту сладкую перегрузку метода, но она не подходит в силу моей платформы (.Net Framework 4.8).


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

Автор решения: aepot

Ну например так

int timeout = 500; // 500 миллисекунд
using (var stream = new SslStream(...))
{
    Task t = stream.AuthenticateAsClientAsync(null);
    if (await Task.WhenAny(t, Task.Delay(timeout)) == t)
    {
        // ваш код в случае успеха
    }
    else
        Debug.WriteLine("Timeout in AuthenticateAsClientAsync");
}

То есть саму процедуру авторизации не прерываем, но диспозим SslStream, если произошел таймаут. Собственно Dispose() и прервёт всё что нужно.

P.S. Пора бы уже переехать как минимум на .NET Core 3.1

→ Ссылка