Я думаю, что лучший подход - это вызвать BeginAccept (), а в OnAccept снова вызвать BeginAccept. Это должно дать вам лучший параллелизм.
OnAccept должен выглядеть примерно так:
private void OnAccept(IAsyncResult ar)
{
bool beginAcceptCalled = false;
try
{
//start the listener again
_listener.BeginAcceptSocket(OnAccept, null);
beginAcceptCalled = true;
Socket socket = _listener.EndAcceptSocket(ar);
//do something with the socket..
}
catch (Exception ex)
{
if (!beginAcceptCalled)
{
//try listening to connections again
_listener.BeginAcceptSocket(OnAccept, null);
}
}
}