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

4

0 回答 0