Socket.ReceiveAsync何时同步返回?

时间:2012-08-11 15:13:46

标签: c# sockets asynchronous

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

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将同步返回并执行与接收一样快但因为它几乎从未发生过,我无法分辨。 我对ReceiveAsync的期望是错误的吗?

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

很抱歉迟到的回复:)

我使用Socket.Available Property解决了我的问题。

Do
If MySocket.Available > 0 Then
bytes = MySocket.Receive(bytesReceived, bytesReceived.Length, 0)
textFrom &= Encoding.ASCII.GetString(bytesReceived, 0, bytes)
Else
Exit Do
End If
Loop While bytes = bytesReceived.Length