C#: как закрыть sslStream из другого потока

Я пытаюсь дать sslStream читать асинхронно в течение 5 секунд. Если поток не получил ничего через 5 секунд, поток будет закрыт.

Проблема текущей реализации заключается в том, что закрытие потока с помощью этого трюка выдаст на консоли ошибку: "Невозможно получить доступ к удаленному объекту.

Есть ли другой способ достичь моей цели без этой ошибки?

Вот мой код:

private static async Task<string> ReadMessageAsync(SslStream pSslStream)
{
    byte[] buffer = new byte[2048];
    StringBuilder messageData = new StringBuilder();
    int bytes = -1;
    try
    {
        do
        {
            bytes = await pSslStream.ReadAsync(buffer, 0, buffer.Length)
                .TimeoutAfter(TimeSpan.FromSeconds(5));

            Decoder decoder = Encoding.UTF8.GetDecoder();
            char[] chars = new char[decoder.GetCharCount(buffer, 0, bytes)];
            decoder.GetChars(buffer, 0, bytes, chars, 0);
            messageData.Append(chars);

            if (messageData.ToString().IndexOf("<EOF>") != -1)
            {
                break;
            }
        } while (bytes != 0);
    }
    catch (TimeoutException)
    {
        Console.WriteLine("Timeout");
        pSslStream.Close();
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }

    return messageData.ToString();
}

public static async Task<T> TimeoutAfter<T>(this Task<T> task, TimeSpan timeout)
{
    if (task != await Task.WhenAny(task, Task.Delay(timeout)))
    {
        throw new TimeoutException("Timeout");
    }

    return task.Result;
}

P / s: метод расширения был из Как вы ловите исключения обратного вызова CancellationToken.Register?

0 ответов

Другие вопросы по тегам