のドキュメントにSocket.SendAsync
は、その戻り値が保留中の非同期操作 (true を返す) またはすぐに完了した操作 (false を返す) のいずれかを示すと書かれています。
私の場合、戻り値は常にtrueです。すべての送信リクエストは、完了すると非同期コールバックになり、同期的に完了することはありSendAsync
ません。
データを 8KB のシステム送信バッファに入れて返さないのはなぜですか? それは何を待っていますか?
簡単なテスト ケース (クリーンアップ コードを削除) で確認できます。
TcpListener listener = new TcpListener(IPAddress.Any, 35001);
listener.Start();
Socket client = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
client.Connect(new IPEndPoint(IPAddress.Loopback, 35001));
Socket server = listener.AcceptSocket();
SocketAsyncEventArgs asyncArgs = new SocketAsyncEventArgs();
asyncArgs.SetBuffer(new byte[] { 1, 2, 3 }, 0, 3);
bool pending = client.SendAsync(asyncArgs);
Assert.IsFalse(pending); // fails - asynchronous operation is pending
私のモチベーションはパフォーマンスです。少し速いので、ほとんどの送信を同期的に完了させたいと思います。同期完了がなければ、すでに CPU を集中的に使用するアプリケーション ロジックに加えて、1 秒あたり 200 万回の非同期コールバックを処理する必要があります。