У меня есть приложение, которое одновременно создает пару сотен 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() method called after
StartReceive () . Creating a new task for
StartReceive () would just end up with 300-ish threads, and it seems to do so just by calling
StartReceive () `в любом случае.
Каков будет правильный способ реализации новых ключевых слов async
и await
в моем существующем коде при использовании NetworkStream
, поэтому он использует пул потоков, который используются Socket.SendAsync()
и Socket.ReceiveAsync()
, чтобы избежатьиметь сотни потоков / задач?
Есть ли какое-либо преимущество в производительности при использовании networkstream
таким образом по сравнению с портами завершения ввода / вывода с beginreceive
?