通过超时取消 TcpClient ReadAsync 操作并捕获 .NET 4.5 中的此超时事件的正确方法是什么?
TcpClient.ReadTimeout 似乎适用于同步只读。
UPDATE:
尝试应用此处描述的方法取消异步操作
var buffer = new byte[4096];
CancellationTokenSource cts = new CancellationTokenSource(5000);
int amountRead = await tcpClientStream.ReadAsync(buffer, 0, 4096, cts.Token);
但它永远不会因超时而取消。有什么问题吗?
所以我知道那是很久以前的事了
但谷歌仍然把我带到这里
我看到没有人标记为答案
对我来说,我这样解决
我进行了扩展以添加需要额外超时的方法 ReadAsync
public static async Task<int> ReadAsync(this NetworkStream stream, byte[] buffer, int offset, int count, int TimeOut)
{
var ReciveCount = 0;
var receiveTask = Task.Run(async () => { ReciveCount = await stream.ReadAsync(buffer, offset, count); });
var isReceived = await Task.WhenAny(receiveTask, Task.Delay(TimeOut)) == receiveTask;
if (!isReceived) return -1;
return ReciveCount;
}
所以如果它返回-1则意味着读取超时
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)