受信済みの少量のデータを読み取るときの同期メソッドと非同期メソッドのパフォーマンスを比較してみました。だから私はデータを送信し、受信ソケット(同じプログラム)で待機していることを確認します。
source.Send(sendBuffer);
while (target.Available != sendBuffer.Length)
Thread.Sleep(50);
SocketAsyncEventArgs arg = new SocketAsyncEventArgs();
arg.Completed += AsyncCallback;
arg.SetBuffer(receiveBuffer, 0, sendBuffer.Length);
if(target.ReceiveAsync (arg))
{
//Pending request
//999 out of 1000 times we end up here
}
驚いたことに、ReceiveAsync 呼び出しが同期的に終了することはほとんどありませんでした。ReceiveAsync は同期的に戻り、Receive と同じくらい速く実行されると思いますが、ほとんど発生しないため、わかりません。ここで ReceiveAsync に対する私の期待は間違っていましたか?
常に最初に target.Available をチェックし、利用可能な十分なバイトがある場合は Receive を実行する方がよいでしょうか? この種のことは、BeginReceive ではなく ReceiveAsync を使用する利点の一部を損なうため、この質問を書いています。