Remplacement de Socket.ReceiveAsync par NetworkStream.ReadAsync (awaitable)

J'ai une application qui fait quelques centaines de connexions TCP en même temps, et reçoit un flux constant de données.

 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); }
    }

Mes tentatives ont conduit à quelque chose comme ceci:

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);
        }
    }

Le problème que j'ai eu a été la méthode d'appel StartReceive() serait de les bloquer, et de ne pas obtenir à l'accompagnement StartSend() method called afterStartReceive(). Creating a new task forStartReceive()would just end up with 300-ish threads, and it seems to do so just by callingStartReceive()` de toute façon.

Quelle serait la bonne méthode de la mise en œuvre de la nouvelle async et await les mots clés sur mon code existant lors de l'utilisation d'un NetworkStream de sorte qu'il utilise le pool de threads que Socket.SendAsync() et Socket.ReceiveAsync() sont utilisation afin d'éviter d'avoir des centaines de threads/tâches?

Est-il un avantage de performance de l'aide networkstream de cette manière plus de i/o ports de fin avec beginreceive?

source d'informationauteur Josh