我有一个应用程序可以同时建立几百个 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()`。
在使用 a 时在现有代码上实现 newasync
和关键字的正确方法是什么,因此它正在使用线程池来避免必须拥有数百个线程/任务?await
NetworkStream
Socket.SendAsync()
Socket.ReceiveAsync()
networkstream
以这种方式使用 i/o 完成端口是否有任何性能优势beginreceive
?