Stream
特定の終了バイトが見つかるまで、から読み取る非同期読み取りを実現したいと考えています。指定されたバイトが見つかるまでどれくらいの時間を読み取らなければならないのか、実際にはわかりません。スレッドが結果を待機するのを避けたいと思います。他のものは後で同じストリームを読み取ります。これは、終了バイトの後であまり先を読み取ることができないことを意味します。
BeginRead
これまでのところ、とEndRead
関数のペアと recursiveを使用してこれを管理してきましたAsyncCallback
。これはうまく機能しますが、すべての読み取りが同期して完了すると非常に印象的なコールスタックが生成されることがあるため、長さが非常に長い場合にこれがどのようにスケーリングされるかが少し心配です。
public void ReadUntilSpecificByte(Stream stream, byte terminator, Action<byte[]> onComplete)
{
var output = new List<byte>();
var buffer = new byte[1];
Action[] readAction = { null };
readAction[0] = () => stream.BeginRead(buffer, 0, 1, asyncResult =>
{
stream.EndRead(asyncResult);
if (buffer[0] == terminator)
{
onComplete(output.ToArray());
}
else
{
output.Add(buffer[0]);
readAction[0]();
}
}, stream);
readAction[0]();
}
問題ではない可能性が高い何かについて心配していますか、それともより多くのスタックスペースで実行されるよりスマートな方法でこれを書くことができますか? 残念ながら、私は c# 4.5 を使用できません。これにより、この作業が大幅にスムーズになると思います。通常、ストリーム自体はNetworkStream
またはSslStream
です。
編集: Marc によって提案されたアプローチを採用し、すべての読み取りに対して内部バッファーを作成し、2k バッファーを維持しました。これは、潜在的に高価な読み取りをより有効に活用する実用的なソリューションです。これは、基礎となるソケットから可能な限り多くの読み取りを行うためです。それを避けることができればまだクールだったでしょうが、それは完全に非同期であることの代償の一部だと思います.