.net - SocketAsyncEventArgs "pooled byte[]"样式是否有助于减少内存需求?

标签 .net sockets networking tcp socketasynceventargs

我看不到 pooled SocketAsyncEventArgs样式帮助我减少了为许多并发连接提供服务的服务器的内存消耗。

是的,它提供了 MS 的 Begin/End 样式的替代方案,上述 MSDN 页面将其描述为要求为每个异步套接字操作分配一个 System.IAsyncResult 对象

最初的研究让我相信,出于某种原因,它最多只能分配少数几个字节数组,并在我的数千个并发连接的客户端之间共享它们。

但似乎如果我想在数千个客户端连接上等待数据,我必须调用 ReceiveAsync 数千次,每次都提供不同的字节数组(包装在 SocketAsyncEventArgs 中),然后,那数千个数组将一直坐在那里,直到客户端决定发送为止,这很可能是 10 秒。

因此,除非我在客户端发送数据时调用 ReceiveAsync(或者在那之后,依赖于一些网络堆栈缓冲区?)——这由客户端自行决定并且服务器无法预测,否则我很不走运并且字节数组将坐在那里,无所事事地等待客户端移动他的底部。

我希望用一个字节数组(或者每个监听线程一个数组,如果并行化有意义的话)来监听那数千个连接,并且一旦这些连接中的任何一个发送了一些东西(这确实必须进入一些无论如何首先是网络堆栈缓冲区),它将被复制到该数组中,我的监听器被调用,一旦监听器完成,该数组就可以重用。

使用 Socket.*Async() 方法确实不可能吗?

.net 的套接字库完全可以实现这样的功能吗?

最佳答案

不可能为多个套接字操作共享相同的内存(或者如果您收到未定义的结果)。

您可以通过一开始只读取 1 个字节来规避这个问题。当读取完成时,很可能会有更多数据到来。因此,对于下一次读取,您使用更有效的大小,例如 4KB(或者您询问 DataAvailable 属性 - 这是该属性的唯一有效用例)。

关于.net - SocketAsyncEventArgs "pooled byte[]"样式是否有助于减少内存需求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29515280/

相关文章:

c# - 触发并忘记异步任务方法有时不会调用

c# - "Unable to read data from the transport connection"- C#

networking - PPP 和以太网的开销

c# - 移除对继承的抽象类引用的依赖

c# - .NET 多线程访问共享登录 session

c# - 在 .NET 中从 NetworkStream 读取的正确方法是什么

java - 如何多次实例化一个实现可运行并打开套接字的类?

Android——通过socket编程发送图片

python - python 中网络拓扑的表示

.net - 如何在指定节点TOC(.NET)上打开CHM文件