gpt4 book ai didi

c# - Socket.ReceiveAsync 什么时候同步返回?

转载 作者:太空宇宙 更新时间:2023-11-03 13:56:39 32 4
gpt4 key购买 nike

在读取已接收到的少量数据时,我尝试比较同步方法和异步方法的性能。所以我发送数据并确保它正在等待接收套接字(相同的程序)。

source.Send(sendBuffer);
while (target.Available != sendBuffer.Length)
Thread.Sleep(50);
SocketAsyncEventArgs arg = new SocketAsyncEventArgs();
arg.Completed += AsyncCallback;
arg.SetBuffer(receiveBuffer, 0, sendBuffer.Length);
if(target.ReceiveAsync (arg))
{
//Pending request
//999 out of 1000 times we end up here
}

令我惊讶的是,ReceiveAsync 调用几乎从未同步完成。我假设 ReceiveAsync 会同步返回并执行得与 Receive 一样快,但由于它几乎从未发生过,我无法判断。我对 ReceiveAsync 的期望在这里是错误的吗?

总是首先检查 target.Available 并在有足够字节可用时执行 Receive 会更好吗?这种情况破坏了使用 ReceiveAsync 而不是 BeginReceive 的一些好处,这就是我写这个问题的原因。

最佳答案

ReceiveAsync 只是调用底层的 Winsock 子系统。 ReceiveAsync 使用所谓的 Overlapped IO(异步 IO)。在创建套接字以使用重叠 IO 的情况下:“无论传入数据是否填充所有缓冲区,重叠套接字都会出现完成指示”。其中“完成指示”是将被异步调用的回调。这意味着 ReceiveAsync 将始终是异步的(除非出现错误)。

关于c# - Socket.ReceiveAsync 什么时候同步返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11915815/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com