通过超时取消TcpClient ReadAsync操作并在.NET 4.5中捕获此超时事件的正确方法是什么?
TcpClient.ReadTimeout似乎应用于同步只读.
更新:
Tried tro应用此处描述的方法取消异步操作
var buffer = new byte[4096];
CancellationTokenSource cts = new CancellationTokenSource(5000);
int amountRead = await tcpClientStream.ReadAsync(buffer, 0, 4096, cts.Token);
Run Code Online (Sandbox Code Playgroud)
但它永远不会超时取消.有什么问题吗?
我有一个C#TcpClient来异步读取数据.简化代码如下:
public async Task StartReading(CancellationToken token)
{
// To fit the largest package
const int BufferSize = 524288;
while(true)
{
var buffer = new byte[BufferSize];
int bytesRead = await this.networkStream.ReadAsync(buffer, 0, BufferSize);
.WithWaitCancellation(token);
if (bytesRead > 0)
{
Console.Read(string.Fromat("{0} bytes received."));
// Run processing at background process
Task.Run(() => ProcessData(buffer, bytesRead));
}
else
{
// If received 0 bytes then a tcp connection is terminated
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
收到的包可能包含一个或多个以STX开头并以ETX结尾的消息,不会发送包长度.此Feed由第三方提供,不会更改.
在测试期间,似乎服务器以8192个块发送数据,因此消息可能被分成两个后续的块并且无法处理.
这是一个日志:
8192字节收到
消息89处理/ 1失败
8192字节收到
消息89处理/ 2失败
8192字节收到
消息89处理/ …