gpt4 book ai didi

c# - 在这种情况下是否值得合并 SocketAsyncEventArgs 以供重用?

转载 作者:行者123 更新时间:2023-11-30 18:36:59 28 4
gpt4 key购买 nike

在我的场景中,有许多客户端的 tcp 套接字连接到服务器。服务器从所有套接字接收 ReceiveAsync(),当回调被无误调用时,解析接收到的数据。如果一个套接字接收到的数据是某种类型的消息,则接收回调将通过循环将 SendAsync() 发送到所有其他套接字,然后再次启动 ReceiveAsync()。所以对于一个套接字,它有机会通过许多其他接收者的回调调用 SendAsync()在很短的时间内。我尝试通过 waitone 信号量来同步 Sendings,并在发送 IO 完成后释放一个信号量,这样我每个套接字只能使用一个 SAEA obj,但这可能会导致接收方的回调阻塞在发送循环中。所以我取消了信号量,并为每个套接字的发送方法汇集了一些 SAEA objs。但是我发现有些手机客户端很有可能会丢失IP连接,并且不会及时调用socket SendAsync()方法的错误回调。可能在几分钟后,没有SAEA会被回收到池中。

另一个问题是,如果我将可重用的 SAEA 池化,SAES.Buffer 会产生内存碎片吗?我可以通过在池化 SAEA 之前调用 SAEA.SetBuffer(null,0,0) 方法来避免内存问题吗?

最佳答案

为了避免内存碎片,我们使用一个巨大的缓冲区并将该缓冲区的特定区域分配给每个 SAEA。因此,内存使用量在整个时间内保持不变,并且内存是连续分配的。

现在我们使用可以作为 PITA 的汇集 SAEA,但这似乎是最受提倡的解决方案(如果您完全使用 SAEA)

关于c# - 在这种情况下是否值得合并 SocketAsyncEventArgs 以供重用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13243462/

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