データを非同期的に読み取るための 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 で終わる 1 つ以上のメッセージが含まれる場合があり、パッケージの長さは送信されません。このフィードはサードパーティによって提供され、変更されることはありません。
テスト中に、サーバーがデータを 8192 チャンクで送信するように見えたため、メッセージが 2 つの後続のチャンクに分割され、処理に失敗する可能性がありました。
ログは次のとおりです。
8192 バイトの受信
メッセージ 89 の処理 / 1 失敗
8192 バイトの受信
メッセージ 89 の処理 / 2 の失敗
8192 バイトの受信
メッセージ 89 の処理 / 2 の失敗
2349 バイトの受信
メッセージ 34 の処理 / 1 の失敗
同期読み取りも役に立ちません。どうすれば管理できますか?