C#以异步方式接受套接字-最佳实践

C#以异步方式接受套接字-最佳实践,c#,sockets,asynchronous,C#,Sockets,Asynchronous,以异步方式接受新套接字的最佳方式是什么 第一种方式: while (!abort && listener.Server.IsBound) { acceptedSocketEvent.Reset(); listener.BeginAcceptSocket(AcceptConnection, null); bool signaled = false; do { signaled = acceptedSocketEvent.Wai

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

第一种方式:

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);
}
listener.BeginAcceptSocket(AcceptConnection, null);
while (!abort && listener.Server.IsBound)
{  
   Thread.Sleep(500);
}
其中,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...
    ....
}
或第二种方式:

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);
}
listener.BeginAcceptSocket(AcceptConnection, null);
while (!abort && listener.Server.IsBound)
{  
   Thread.Sleep(500);
}
连接将是:


你喜欢哪种方式?为什么?

我非常喜欢第二种方式;继续从接受连接的事件中“BeginAccept”对我来说似乎更容易理解。您甚至可以将侦听套接字连接到IAsyncResult,并在Accept事件中获取它,以避免使用任何全局变量。

我非常喜欢第二种方法;继续从接受连接的事件中“BeginAccept”对我来说似乎更容易理解。您甚至可以将侦听套接字连接到IAsyncResult,并在Accept事件中获取它,以避免使用任何全局变量。

我首选的方法是使用F#,这非常简单和明智:一种不需要学习整个其他语言的方法可能更有用。我首选的方法是使用F#,这一切都是简单而理智的:一种不需要学习整个其他语言的方法可能会更有帮助。想想第二种方法,但是,当AcceptSocket方法中发生异常且此侦听器从不接受任何新连接时,这有可能不调用BeginAccept。将通过调用EndAcceptSocket引发异常,然后您可以捕获并最终再次启动BeginAccept。考虑第二种方法,但是,当AcceptSocket方法中发生异常且此侦听器从不接受任何新连接时,这可能不会调用BeginAccept。将通过调用EndAcceptSocket引发异常,然后您可以捕获并最终再次启动BeginAccept。