C#在async fasion中接受套接字 - 最佳实践

时间:2010-05-04 15:03:29

标签: c# sockets asynchronous

以异步方式接受新套接字的最佳方式是什么。

第一种方式:

while (!abort && listener.Server.IsBound)
{  
  acceptedSocketEvent.Reset();  
  listener.BeginAcceptSocket(AcceptConnection, null);  

  bool signaled = false;  
  do  
  {  
     signaled = acceptedSocketEvent.WaitOne(1000, false);
  } while (!signaled && !abort && listener.Server.IsBound);
}

其中 AcceptConnection 应为:

private void AcceptConnection(IAsyncResult ar)
{
    // Signal the main thread to continue.
    acceptedSocketEvent.Set();

    Socket socket = listener.EndAcceptSocket(ar);
    // continue to receive data and so on...
    ....
}

或第二种方式:

listener.BeginAcceptSocket(AcceptConnection, null);
while (!abort && listener.Server.IsBound)
{  
   Thread.Sleep(500);
}

AcceptConnection 将是:

private void AcceptConnection(IAsyncResult ar)
{
    Socket socket = listener.EndAcceptSocket(ar);
    // begin accepting next socket
    listener.BeginAcceptSocket(AcceptConnection, null);
    // continue to receive data and so on...
    ....
}

您最喜欢的方式是什么?为什么?

1 个答案:

答案 0 :(得分:1)

我真的很喜欢第二种方式;从接受连接的事件继续“BeginAccept”看起来对我来说更具可读性。您甚至可以将Listening套接字附加到IAsyncResult,并在Accept事件中获取它,以避免使用任何全局变量。