ソケット接続を介してさまざまなサイズのシリアル化可能なオブジェクトを送信するアプリがありますが、可能な限りスケーラブルにしたいと考えています。また、数十から数百もの接続が存在する可能性があります。
- NetworkStreamは、着信メッセージを継続的にリッスンしているTcpClientから送信されます。
- 標準のNetworkStream.Read()でスレッドをブロックしたくありません。これはスケーリングする必要があります。これは、この種のクラスのかなり標準的な動作であり、クラスにReadTimeoutプロパティがあるため、Read()ブロックのみを想定しています。
- BinaryFormatterがRead()を使用するだけなのか、それともAsyncの一部を内部で実行するのかはわかりません。私の推測は違います。
- TcpClientはメッセージを取得し、最後まで読んでから、メッセージのリッスンに戻る必要があります。
ですから、この猫の皮を剥ぐ方法は多すぎるようです。実際に何が最も効率的かはわかりません。私は:
BinaryFormatterを使用してNetworkStreamを読み取るだけですか?
var netStream = client.GetStream();
var formatter = new BinaryFormatter();
var obj = formatter.Deserialize(netStream);
または、新しいasync / awaitで魔法をかけましょう:
using(var ms = new MemoryStream())
{
var netStream = client.GetStream();
var buffer = new byte[1028];
int bytesRead;
while((bytesRead = await netStream.ReadAsync(buffer, 0, buffer.length)) > 0) {
ms.Write(buffer, 0, buffer.Length);
}
var formatter = new BinaryFormatter();
var obj = formatter.Deserialize(ms);
}
または上記と同様に、新しいCopyToAsyncメソッドのみを利用します。
using(var ms = new MemoryStream())
{
var netStream = client.GetStream();
await netStream.CopyToAsync(ms); //4096 default buffer.
var formatter = new BinaryFormatter();
var obj = formatter.Deserialize(ms);
}
または何か他のもの?
最もスケーラビリティ/効率性を提供する答えを探しています。
[注:上記はすべてPSUEDOコードであり、例として示されています]