Поддержка отмены для метода TcpClient.ConnectAsync - PullRequest
0 голосов
/ 18 мая 2019

Я надеюсь получить некоторые мнения о добавлении устойчивости к части, над которой я работаю, которая включает в себя создание нескольких TcpClient соединений асинхронно с различными серверами и после успешного установления TCP-соединений, а затем сохранение TcpClient в виде коллекции (просто выдержка из требования)

Это то, что я имею до сих пор:

internal class Program
{
    private static readonly TcpClient _client = new TcpClient(AddressFamily.InterNetwork);
    private static SslStream _stream;

    private static async Task Main(string[] args)
    {
        var timeoutTask = Task.Delay(5000);
        var connectTask = _client.ConnectAsync("10.14.16.24", 56564);

        var completedTask = await Task.WhenAny(timeoutTask, connectTask);
        if (completedTask == timeoutTask)
            _client.Dispose();

        try
        {
            await connectTask;
            _stream = new SslStream(_client.GetStream(), false);
        }
        catch (SocketException e)
        {
            Console.WriteLine(e.Message);
        }
    }
}

Вопрос : В случае тайм-аута состояние connectTask остается равным "WaitingForActivation", пока метод ConnectAsync не вернет либо Faulted, либо RanToCompletion. Как отменить эту задачу, зная, что ConnectAsync не поддерживает CancellationToken

Любые предложения или улучшения приветствуются. Спасибо

...