Socket.BeginSend尽管有大量的缓冲区空间却没有同步完成为什么Socket.BeginSend如此之快和异步,如此不可预测?我知道它应该是异步的,但它也可以立即完成,在本例中是IAsyncResult.CompletedSynchronously设置。我希望CompletedSynchronously为真,直到8KB发送缓冲区被填满。以下测试用例(为简洁起见删除了清理代码)表明BeginSend在仅缓冲6字节数据后(通常)第3次迭代是异步的:TcpListenerlistener=newTcpListener(IPAddress.Any,35001);监听器.Start();套接字客户端=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp))client.Connect(newIPEndPoint(IPAddress.Loopback,35001));套接字服务器=listener.AcceptSocket())for(inti=1;isent=true,null);Assert.IsTrue(result.CompletedSynchronously,//在第3次迭代时失败典型值String.Format("Asynchronousoniteration{0}",i));断言。是真(已发送);client.EndSend(结果);异步时的精确迭代有点随机。当进程启动时,它是3。然后它是1用于所有新的套接字。我偶尔会看到其他数字。我知道有8KB套接字发送缓冲区,因为Socket.Send(Socket.Blocking=false)在大约8KB处停止。Socket.SendAsync方法的行为类似,但它总是异步完成(即不尝试直接写入缓冲区)。请参阅我关于Socket.SendAsync的相关问题。出于性能原因,我需要BeginSend大部分是同步的(异步回调速度较慢)。更不用说不可预测性破坏了我的低级通信代码的单元测试和基准测试。以上就是C#学习教程:虽然有很多缓冲空间,但是Socket.BeginSend还没有完全同步完成所有的共享内容。如果对大家有用,需要了解更多C#学习教程,希望大家多加关注——本文来自网络收藏,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
