2012-08-11 126 views
2

當試圖讀取已經收到的少量數據時,我試圖比較同步和異步方法之間的性能。 所以我發送的數據,並確保它正在等待接收套接字(相同的程序)。什麼時候Socket.ReceiveAsync同步返回?

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的期望是否錯誤?

總是首先檢查目標是否會更好?如果有足夠的可用字節,可用並執行接收? 這種類型打破了使用ReceiveAsync而不是BeginReceive的一些好處,這就是爲什麼我要寫這個問題。

回答

1

ReceiveAsync只是調用底層的Winsock子系統。 ReceiveAsync使用所謂的重疊IO(異步IO)。在使用重疊IO創建套接字的情況下:「無論傳入數據是否填滿所有緩衝區,完成指示都發生在重疊套接字上」。其中「完成指示」是將被異步調用的回調。這意味着ReceiveAsync將始終是異步的(除非有錯誤)。

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 
相關問題