为什么我的 C# 套接字程序有很多 \device\afd 句柄?

Why my C# socket program has lots of \device\afd handles?

提问人:Reza Akraminejad 提问时间:3/14/2018 最后编辑:Reza Akraminejad 更新时间:7/11/2018 访问量:6276

问:

我写了一个 tcp 套接字 prgram,可以异步使用套接字。

这是我代码的一部分:

public void main()
{
   var e = new SocketAsyncEventArgs();
   e.Completed += new EventHandler<SocketAsyncEventArgs>(e_Completed);
   Task.Factory.StartNew(() =>
   {                        
         allDone.Reset();
         mySocket.AcceptAsync(e);
         allDone.WaitOne();                       
   });
}

public void e_Completed(object sender, SocketAsyncEventArgs e)
{
     var socket = (Socket)sender;
     ThreadPool.QueueUserWorkItem(HandleTcpRequest, e.AcceptSocket);
     e.AcceptSocket = null;
     socket.AcceptAsync(e);
}

public void HandleTcpRequest(object state)
{
    var mySocket = (Socket)state;
    try
    {
       //do some codes and work with mySocket 
    }
    catch (Exception ex)
    {
    }
    finally
    {
        mySocket.Close();
        mySocket.Dispose();
    }
}

在我的进程中,我在进程资源管理器中看到了很多\device\afd。我已经阅读并搜索了很多关于此的内容,发现它与辅助功能驱动程序和传输驱动程序接口有关。如何解决此手柄泄漏?

==========>编辑了我的代码:

编辑为仅接受 10 个同步方式的套接字。

感觉程序更快,但是当我将手指按在 Ctrl+F5 上时,发现 进程资源管理器中有 10 个以上的 \device\afd,当继续推送时,请参阅更多 \device\afd,但低于代码上方。

 mySocket.Listen(10);
 while (true)
 {                                                
      using (Socket so = mySocket.Accept())
      {
            HandleTcpRequest(so);
      }   
 }
C# tcpsocket 句柄泄漏

评论

0赞 Camilo Terevinto 3/14/2018
您发布了 3 种彼此完全无关的方法。请发布一个最小的可重复示例
0赞 jdweng 3/14/2018
您的代码永远不会终止。注意设置 allDone waithandle。因此,您认为程序正在关闭,但实际上它并没有关闭。有关解决问题的建议,请参阅以下帖子:social.msdn.microsoft.com/Forums/sqlserver/en-US/...
0赞 Reza Akraminejad 3/14/2018
@CamiloTerevinto 我编辑了我的代码
0赞 Reza Akraminejad 3/14/2018
@jdweng 我编辑了我的代码
1赞 Jeroen Mostert 3/14/2018
无意冒犯,但您混合的线程池代码、同步等待句柄和任务向我表明,当您尚未掌握网络代码的复杂性时,您正在使用它。请考虑以异步方式使用,或者,如果确实需要更进一步,请考虑使用方法的异步版本。 是高级的东西,实际上应该只进入需要处理大量负载的服务器,并且已经用尽了其他明显的优化途径,因为它不是最简单的 API。SocketAsyncEventArgsTcpClientSocketSocketAsyncEventArgs

答: 暂无答案