我有一个应用程序通过套接字连接发送不同大小的可序列化对象,我希望它尽可能具有可扩展性。也可能有数十个甚至数百个连接。
- NetworkStream 来自持续侦听传入消息的 TcpClient。
- 我不想用标准的 NetworkStream.Read() 阻塞线程。这需要扩展。我只是假设 Read() 块,因为这是这类类的非常标准的行为,并且类上有一个 ReadTimeout 属性。
- 我不确定 BinaryFormatter 是否只使用 Read() 或者它是否在后台为我做了一些异步的东西。我的猜测是否定的。
- 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);
}
或者别的什么?
我正在寻找提供最大可扩展性/效率的答案。
[注:以上均为伪代码,以示例为例]