Как запустить асинхронную задачу Task на n секунд?
Доброго времени суток!
Мне требуется асинхронно запустить некоторую задачу System.Threading.Tasks.Task, но проблема в том, что она никогда не завершается, и мое приложение навсегда зависает в режиме ожидания ее выполнения.
Говоря конкретно, я работал с классом SslStream. На клиентском приложении я запускаю асинхронную операцию аутентификации (await) stream.AuthenticateAsClientAsync(null). Сервер тут же отклоняет ее (проблема с сертификацией), а запущенная асинхронная операция, как оказалось, может провисеть бесконечно долго. В итоге мое клиентское приложение не может продолжать работу.
Вопрос: Как мне асинхронно запустить задачу System.Threading.Tasks.Task так, чтобы она была отменена через, например, 10 секунд?
Да, я вижу эту сладкую перегрузку метода, но она не подходит в силу моей платформы (.Net Framework 4.8).
Ответы (1 шт):
Ну например так
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