2

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

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 会破坏一些好处,这就是我写这个问题的原因。

4

2 回答 2

1

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

于 2012-08-11T20:36:25.360 回答
0

抱歉回复晚了 :)

我使用 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
于 2014-09-17T19:23:44.970 回答