我有一个 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;
}
}
}
收到的包可能包含一条或多条以 STX 开头并以 ETX 结尾的消息,不发送包长度。此 Feed 由第 3 方提供,不会更改。
在测试过程中,服务器似乎以 8192 个块发送数据,因此一条消息可能被分成两个后续块并且无法处理。
这是一个日志:
收到 8192 字节
消息 89 已处理 / 1 失败
8192 字节已接收
消息 89 已处理 / 2 失败
8192 字节已接收
消息 89 已处理 / 2 失败
2349 字节已接收
消息 34 已处理 / 1 失败
同步读取也无济于事。我该如何管理它?