Замена Socket.ReceiveAsync на NetworkStream.ReadAsync (ожидается)

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

 private void startReceive()
    {
        SocketAsyncEventArgs e = new SocketAsyncEventArgs();
        e.Completed += receiveCompleted;
        e.SetBuffer(new byte[1024], 0, 1024);
        if (!Socket.ReceiveAsync(e)) { receiveCompleted(this, e); }  
    }

    void receiveCompleted(object sender, SocketAsyncEventArgs e)
    {
        ProcessData(e);

        if (!Socket.ReceiveAsync(e)) { receiveCompleted(this, e); }
    }

Мои попытки привели к следующему:

private async void StartReceive()
    {
        byte[] Buff = new byte[1024];
        int recv = 0;
        while (Socket.Connected)
        {
            recv = await NetworkStream.ReadAsync(Buff, 0, 1024);
            ProcessData(Buff,recv);
        }
    }

Проблема, с которой я столкнулся, заключалась в том, что вызов метода StartReceive()блокировался и не переходил к сопутствующему методу StartSend(), вызываемому после StartReceive() . Создание новой задачи дляStartReceive() приведет к 300 потокам, и, похоже, это делается простым вызовомStartReceive()`.

Каким будет правильный метод реализации новых ключевых слов asyncи awaitв моем существующем коде при использовании NetworkStream, чтобы он использовал пул потоков которые Socket.SendAsync()и Socket.ReceiveAsync()используют, чтобы избежать необходимости иметь сотни потоков/задач?

Есть ли какое-либо преимущество в производительности от использования networkstreamтаким образом по сравнению с портами завершения ввода-вывода с beginreceive?

10
задан p.campbell 18 June 2013 в 21:01
поделиться