У меня есть приложение, которое одновременно создает пару сотен 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() `anyways.
Каким будет правильный метод реализации новых async
и await
ключевых слов в моем существующем коде при использовании NetworkStream
, поэтому используется пул потоков, который Socket.SendAsync()
и Socket.ReceiveAsync()
используют, чтобы избежать нужно иметь сотни потоков/задач?
Есть ли преимущество в производительности при использовании NetworkStream
таким образом через порты завершения ввода/вывода с beginreceive
?