C# Socket.ReceiveAsync何时同步返回?

C# Socket.ReceiveAsync何时同步返回?,c#,sockets,asynchronous,C#,Sockets,Asynchronous,我试图在读取少量已经接收到的数据时比较同步和异步方法的性能。 因此,我发送数据并确保它在接收套接字上等待(相同的程序) 令我惊讶的是,ReceiveAsync调用几乎从未同步完成。 我假设ReceiveAsync将同步返回,并以与Receive一样快的速度执行,但由于它几乎从未发生过,所以我无法判断。 我对ReceiveAsync的期望是否有误 总是首先检查target.Available是否更好,如果有足够的字节可用,则执行接收操作? 这种情况破坏了使用ReceiveAsync而不是Begin

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

令我惊讶的是,ReceiveAsync调用几乎从未同步完成。 我假设ReceiveAsync将同步返回,并以与Receive一样快的速度执行,但由于它几乎从未发生过,所以我无法判断。 我对ReceiveAsync的期望是否有误

总是首先检查target.Available是否更好,如果有足够的字节可用,则执行接收操作?
这种情况破坏了使用ReceiveAsync而不是BeginReceive的一些好处,这就是我写这个问题的原因。

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

很抱歉回复太晚:)

我使用Socket.Available属性修复了我的问题

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
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