C# 如何避免在等待请求时阻塞.NET线程

C# 如何避免在等待请求时阻塞.NET线程,c#,.net,sockets,C#,.net,Sockets,我有一个服务器应用程序正在侦听System.Net.Sockets.Socket。它阻塞在套接字上。Accept(),将线程捆绑起来。放弃对线程的控制,同时将计算结果提供给调用客户端的好方法是什么 服务器代码经过清理后如下所示: void ManeLupe(Socket socket) { for (;;) { Socket client = null; NetworkStream stm = null; try

我有一个服务器应用程序正在侦听
System.Net.Sockets.Socket
。它阻塞在
套接字上。Accept()
,将线程捆绑起来。放弃对线程的控制,同时将计算结果提供给调用客户端的好方法是什么

服务器代码经过清理后如下所示:

void ManeLupe(Socket socket)
{
    for (;;)
    {
        Socket client = null;
        NetworkStream stm = null;
        try 
        {
            client = socket.Accept();             // Blocks thread
            stm = new NetworkStream(client);
            var response = ProcessRequest(stm);   // this could take a while
            WriteResponse(response, stm);
        }
        catch (Exception ex)
        {
            LogError(client, ex);
        }
        finally
        { 
            if (stm != null) stm.Dispose();
            if (client != null) client.Dispose();
        }
    }
}

目前,我的限制是代码必须在.NETFramework3.5上运行,因此我无法利用新型的
任务
异步
功能。坦白地说,我对异步编程一般来说是比较陌生的,我怀疑这将是这个问题的答案。

套接字提供了Accept called的异步变体,这正是您所追求的

beginacept
是Accept的APM实现,它为每个操作提供了一对方法。在本例中,您将使用
beginacept
EndAccept


正如@ CoryNelson评论中所提到的,你也可以考虑使用。这取决于你选择哪一个。

@CoryNelson是的,没错。就我个人而言,我不喜欢那个事件(EAP)模式。我会在我的回答中加上它,谢谢。事实上,这取决于它的用途。AcceptSync是性能的低级别。当然,就可用性而言,APM并没有好多少。
     You can use AcceptAsync and register to the callback to do your processing after the accept is completed. Simple example below

           void ManeLupe(Socket socket)
            {

                var args = new SocketAsyncEventArgs();
                args.Completed += Accept_Completed;
                socket.AcceptAsync(args);
            }

            void Accept_Completed(object sender, SocketAsyncEventArgs e)
            {
                //do your processing here
            }