2011-08-06 12 views
2

以下に示すように、私は継続的にC#の非同期メソッドを呼び出す場合:ソケットプログラミング:送信と読み取りの非同期メソッドでデータの順序を保証できますか?

socket.BeginSend(data1, 0, data1.Length, 0, 
     new AsyncCallback(SendCallback1), handler); 
socket.BeginSend(data2, 0, data2.Length, 0, 
     new AsyncCallback(SendCallback2), handler); 

非同期メソッドは、データの順序を保証することはできますか?

非同期操作をサポートしている他のネットワークライブラリで問題が認識されていますか?
内部で非同期操作でデータの順序を保証するにはどうすれば実装されますか?

答えて

1

いいえ非同期メソッドでは、送信しているデータが順番に送信されたり、呼び出しまたは送信されたりすることはありません。

Marc氏は、これが正しいアプローチではないことに注意しても、BeginSendを2つずつ並べて呼び出すことはできません。あなたができることは、最初のBeginSendのコールバックメソッドでEndSendを呼び出し、そのコールバック内で次のBeginSendコールを呼び出すことです。

Thisは、トピックの素敵なMSDNの記事は、通常、あなただけEndSendを呼び出した後に、最初からのコールバックの内側に二BeginSendを行うだろう前方

0

を移動する前に、まずそれを読んれます。既に、BeginSendが不完全である場合は、ライブラリが例外をスローすることを期待しています。しかし、それがならスローではない - 私は順序が保証されることを疑う(私は成功がどちらか保証されるとは思わない)。

あなたはまた、このようなことを続ける非同期CTPを考慮して、送信を「待つ」ことができ、継続として追加の作業を実行することができます。

0

例では、BeginSendは同じスレッドによって呼び出されるため、その場合は順序があります。

異なるスレッドからBeginSendを呼び出した場合は、Monitorsを使用してBeginSendを同期させる必要があります。ここ

詳細情報:リンクの第二の答えでhow many async socket requests can be going on on the same socket?

+0

、それは「あなたは、同時に複数のBeginSendsをキューイングすることができますあなたがロックする必要はありません。」と言います。 – atomd

+0

@atomd:あなたは正しいです。私は、あなたが異なるスレッドを通して送られるメッセージに命令を出すことを望むならば、いくつかの同期メカニズムを実装しなければならないことを意味します。あなたのケースでは、同じスレッドからBeginSendを呼び出すと、メッセージが正しい順序で重ね合わされるため、同期は必要ありません。 – Damiox

関連する問題