2

重複の可能性:
Socket.BeginSend は十分なバッファ スペースがあるにもかかわらず同期的に完了しない

のドキュメントに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 万回の非同期コールバックを処理する必要があります。

4

0 に答える 0