gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:42:39 25 4
gpt4 key购买 nike

我看不到 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com