【发布时间】:2012-12-22 19:14:01
【问题描述】:
我有一个应用程序通过套接字连接发送不同大小的可序列化对象,我希望它尽可能具有可扩展性。也可能有数十个甚至数百个连接。
- 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);
}
OR 与上述类似,仅利用新的 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);
}
或者还有别的吗?
我正在寻找可提供最大可扩展性/效率的答案。
[注:以上均为伪代码,举例说明]
【问题讨论】:
-
您为什么不尝试运行您的样本,看看哪个最有效?
-
@svick 我认为并非总是可以测试系统设计是否正确。它必须经过专家的审查。
-
@usr 是的,但这里的问题似乎不是关于正确性,而是关于效率。
-
我真的没有一个很好的方法可以在任何实际负载下进行测试。这是我问的最大原因。我希望让一些经验丰富的兽医倾听插座的发展。我正在努力避免预先出现错误。
标签: c# .net-4.5 async-await networkstream c#-5.0