在我的场景中,有许多客户端的 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) 方法可以避免内存问题吗?