文档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 的应用程序逻辑之外,我还必须每秒处理 200 万次异步回调。