У класса Socket есть метод .AcceptAsync, который возвращает либо true, либо false.
Я думал, что ложное возвращаемое значение было условием ошибки, но в примерах, которые Microsoft предоставляет для асинхронных сокетов, они вызывают функцию обратного вызова синхронно после проверки на ошибку, как показано здесь:
public void StartAccept(SocketAsyncEventArgs acceptEventArg)
{
if (acceptEventArg == null)
{
acceptEventArg = new SocketAsyncEventArgs();
acceptEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(AcceptEventArg_Completed);
}
else
{
// socket must be cleared since the context object is being reused
acceptEventArg.AcceptSocket = null;
}
m_maxNumberAcceptedClients.WaitOne();
bool willRaiseEvent = listenSocket.AcceptAsync(acceptEventArg);
if (!willRaiseEvent)
{
ProcessAccept(acceptEventArg);
}
}
/// <summary>
/// This method is the callback method associated with Socket.AcceptAsync operations and is invoked
/// when an accept operation is complete
/// </summary>
void AcceptEventArg_Completed(object sender, SocketAsyncEventArgs e)
{
ProcessAccept(e);
}
Почему они это делают? Это побеждает назначение асинхронных сокетов и останавливает возврат метода.