有什么方法可以取消 SslStream 上的异步读写任务?我尝试为 ReadAsync 提供 CancellationToken,但它似乎不起作用。当下面的代码达到它的超时时间(Task.Delay)时,它会在 CancellationTokenSource 上调用取消,它应该取消读取任务,向调用方法返回一个错误,调用方法最终会再次尝试读取,这会引发“The当另一个写入操作处于挂起状态时,无法调用 BeginRead 方法”异常。
在我的特定应用程序中,我可以通过关闭套接字并重新连接来解决此问题,但是与重新建立连接相关的开销很高,因此不太理想。
private async Task<int> ReadAsync(byte[] buffer, int offset, int count, DateTime timeout)
{
CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
if (socket.Poll(Convert.ToInt32(timeout.RemainingTimeout().TotalMilliseconds) * 1000, SelectMode.SelectRead) == true)
{
Task<int> readTask = stream.ReadAsync(buffer, offset, count, cancellationTokenSource.Token);
if (await Task.WhenAny(readTask, Task.Delay(timeout.RemainingTimeout())) == readTask)
return readTask.Result;
else
cancellationTokenSource.Cancel();
}
return -1;
}