3

以下に示すように、C#非同期メソッドを継続的に呼び出すと:

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

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

非同期操作をサポートする他のネットワーク ライブラリは問題と見なされますか?
内部的に非同期操作でデータの順序を保証するためにどのように実装されていますか?

4

2 に答える 2

2

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

マークが言ったように、これは正しいアプローチではないことに注意してください。できることは、最初の BeginSend のコールバック メソッドで EndSend を呼び出し、次にそのコールバック内で次の BeginSend を呼び出すことです。

これはトピックに関する MSDN の素晴らしい記事です。先に進む前に最初に読んでください。

于 2011-08-06T10:02:44.047 に答える
1

通常、EndSend を呼び出した後、最初のコールバック内で 2 番目の BeginSend のみを実行します。進行中の不完全な BeginSend が既に存在する場合、ライブラリが例外をスローすることを実際に望んでいます。しかし、それがスローされない場合-順序が保証されるとは思えません(成功も保証されるとは思いません)。

この種の継続がある非同期 CTP を検討することもできます。これにより、送信を「待機」してから、継続として追加の作業を実行できます。

于 2011-08-06T10:06:57.223 に答える