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 を実行する方がよいでしょうか? この種のことは、BeginReceive ではなく ReceiveAsync を使用する利点の一部を損なうため、この質問を書いています。

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 に答える