同時に数百の 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()` に到達しないことでした。
何百ものスレッド/タスクを使用する必要を避けるために使用しているスレッドプールを使用しているときに、既存のコードにnewasync
およびawait
キーワードを実装する正しい方法は何でしょうか?NetworkStream
Socket.SendAsync()
Socket.ReceiveAsync()
networkstream
を使用した I/O 完了ポートよりも、この方法で使用することのパフォーマンス上の利点はありますbeginreceive
か?