У меня есть приложение, которое делает пару сотен 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
?