Какой смысл асинхронной Accept () в программировании сокетов, если WaitOne () все равно блокируется?См пример - PullRequest
0 голосов
/ 13 июня 2019

Этот пример от Microsoft вращается вокруг асинхронного программирования сокетов. Однако, когда он вызывает асинхронную функцию BeginAccept, он затем вызывает функцию WaitOne (), которая в любом случае ожидает завершения BeginAccept.

    // Bind the socket to the local endpoint and listen for incoming connections.  
    try {  
        listener.Bind(localEndPoint);  
        listener.Listen(100);  

        while (true) {  
            // Set the event to nonsignaled state.  
            allDone.Reset();  

            // Start an asynchronous socket to listen for connections.  
            Console.WriteLine("Waiting for a connection...");  
            listener.BeginAccept(   
                new AsyncCallback(AcceptCallback),  
                listener );  

            // Wait until a connection is made before continuing.  
            allDone.WaitOne();  
        }  

    } catch (Exception e) {  
        Console.WriteLine(e.ToString());  
    }  

    Console.WriteLine("\nPress ENTER to continue...");  
    Console.Read();  
}  

Какой смысл использовать неблокирующую версию Accept, если вы все равно сразу же заблокированы? Как я могу изменить эту версию, чтобы позволить мне делать другие вещи, пока BeginAccept не запустит функцию обратного вызова? Я новичок в C #, поэтому я супер потерян. Я из Си и, вероятно, справлюсь с этим, просто разбудив слушателя.

РЕДАКТИРОВАТЬ: Вот пример

https://docs.microsoft.com/en-us/dotnet/framework/network-programming/asynchronous-server-socket-example

...