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?