Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在这种情况下,是否值得将SocketAsyncEventArgs集中在一起以供重用?_C#_Sockets_Socketasynceventargs - Fatal编程技术网

C# 在这种情况下,是否值得将SocketAsyncEventArgs集中在一起以供重用?

C# 在这种情况下,是否值得将SocketAsyncEventArgs集中在一起以供重用?,c#,sockets,socketasynceventargs,C#,Sockets,Socketasynceventargs,在我的场景中,有许多客户端的tcp套接字连接到服务器。服务器从所有套接字接收Async(),并且在调用回调时无误地解析接收到的数据。如果一个套接字接收到的数据是某种类型的消息,则接收回调将通过循环向所有其他套接字发送Async(),然后再次开始接收Async()。因此,对于一个套接字,它有机会通过许多其他接收器的回调调用SendAsync() 在很短的时间内。我试图通过waitone信号量来同步发送,并在发送IO完成后释放一个信号量,这样每个套接字只能使用一个SAEA obj,但这可能会导致发送

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


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

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

现在我们使用的是混合SAEA,它可以是PITA,但它似乎是最受欢迎的解决方案(如果您使用SAEA的话)