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
}