3

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

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

4

1 回答 1

0

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

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

于 2019-07-09T15:13:03.977 回答