async / await или Begin / End с помощью TcpListener?

Мы начали создавать tcp-сервер, который сможет принимать множество клиентов и одновременно получать от всех клиентов новые данные.

До сих пор я использовал IOCP для tcp-серверов, что было довольно легко и удобно, но на этот раз я хочу использовать технологию Async / Await. это было выпущено в C # 5.0.

Проблема в том, что когда я начал писать сервер с использованием async / await, я понял, что в случае использования многопользовательского сервера tcp используется технология async / await. и обычные методы синхронизации будут работать одинаково.

Вот'Вот простой пример, чтобы быть более конкретным:

class Server
{
    private TcpListener _tcpListener;
    private List _clients;
    private bool IsStarted;

    public Server(int port)
    {
        _tcpListener = new TcpListener(new IPEndPoint(IPAddress.Any, port));
        _clients = new List();
        IsStarted = false;
    }

    public void Start()
    {
        IsStarted = true;
        _tcpListener.Start();
        Task.Run(() => StartAcceptClientsAsync());
    }

    public void Stop()
    {
        IsStarted = false;
        _tcpListener.Stop();
    }

    private async Task StartAcceptClientsAsync()
    {
        while (IsStarted)
        {
            // ******** Note 1 ********
            var acceptedClient = await _tcpListener.AcceptTcpClientAsync();

            _clients.Add(acceptedClient);
            IPEndPoint ipEndPoint = (IPEndPoint) acceptedClient.Client.RemoteEndPoint;
            Console.WriteLine("Accepted new client! IP: {0} Port: {1}", ipEndPoint.Address, ipEndPoint.Port);

            Task.Run(() => StartReadingDataFromClient(acceptedClient));
        }
    }

    private async void StartReadingDataFromClient(TcpClient acceptedClient)
    {
        try
        {
            IPEndPoint ipEndPoint = (IPEndPoint) acceptedClient.Client.RemoteEndPoint;
            while (true)
            {
                MemoryStream bufferStream = new MemoryStream();
                // ******** Note 2 ********
                byte[] buffer = new byte[1024];
                int packetSize = await acceptedClient.GetStream().ReadAsync(buffer, 0, buffer.Length);

                if (packetSize == 0)
                {
                    break;
                }

                Console.WriteLine("Accepted new message from: IP: {0} Port: {1}\nMessage: {2}",
                    ipEndPoint.Address, ipEndPoint.Port, Encoding.Default.GetString(buffer));
            }
        }
        catch (Exception)
        { 
        }
        finally
        {
            acceptedClient.Close();
            _clients.Remove(acceptedClient);
        }
    }
}

Теперь, если вы видите строки подПримечание 1 ' а также 'Заметка 2', Он может быть легко изменен на:

Примечание 1 от

var acceptedClient = await _tcpListener.AcceptTcpClientAsync();

в

var acceptedClient = _tcpListener.AcceptTcpClient();

И Примечание 2 от

int packetSize = await acceptedClient.GetStream().ReadAsync(buffer, 0, 1024);

в

int packetSize = acceptedClient.GetStream().Read(buffer, 0, 1024);

И сервер будет работать точно так же.

Итак, зачем использовать async / await в слушателе tcp для нескольких пользователей, еслиЭто то же самое, что использовать обычные методы синхронизации?

Должен ли я продолжать использовать IOCP в этом случае? потому что для меня этоЭто довольно легко и удобно, но я боюсь, что он будет устаревшим или даже более недоступным в новых версиях .NET.

Ответы на вопрос(3)

Ваш ответ на вопрос