当读取少量已接收的数据时,我试图比较同步方法和异步方法的性能。
因此,我发送数据并确保它正在接收套接字(同一程序)上等待。
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并进行接收(如果有足够的字节数)会更好吗?
这种打破了使用ReceiveAsync而不是BeginReceive的一些好处,这就是为什么我要写这个问题。
最佳答案
ReceiveAsync
只是调用基础Winsock子系统。 ReceiveAsync
使用所谓的“重叠IO”(异步IO)。在创建使用重叠IO的套接字的情况下:“无论传入数据是否填充了所有缓冲区,重叠套接字都会出现完成指示”。其中“完成指示”是将被异步调用的回调。这意味着ReceiveAsync
始终都是异步的(除非有错误)。