在这种情况下,是否值得将SocketAsyncEventArgs用于重用?

时间:2012-11-06 02:27:20

标签: c# sockets socketasynceventargs

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

另一个问题是,如果我将可重复使用的SAEA集中在一起,那么SAES.Buffer会制作内存片段吗?在汇集SAEA之前,可以通过调用SAEA.SetBuffer(null,0,0)方法来避免内存问题吗?

1 个答案:

答案 0 :(得分:0)

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

目前,我们使用池化SAEA(可以是PITA),但这似乎是最受提倡的解决方案(如果您使用SAEA的话)