As you can see in the link below, the StreamReceiver method uses the BeginRead method to read asynchronously, since in the SendData method no asynchronous writing is used, what is the logic of reading asynchronously and writing synchronously?
In order to get a good performance, since the read and write data stream would be almost equivalent, should BeginSend be used to write asynchronously?