0

Ye Olde Add Web Reference は、呼び出しが完了したことを呼び出し元に通知するためにイベンティングを使用するサービスへの XXXAsync 呼び出しを生成します。

WPF やコンソール アプリなどでサービス参照を追加すると、非同期操作を生成するように指示されたときに、IAsyncResult デザイン パターン (BeginXXX および EndXXX 操作) が使用されます。私の理解では、これは一般的に使いやすさと柔軟性の一歩前進と見なされていました.コールバックを使用できます.EndXXXを呼び出すだけでいつでもブロックを開始できます.待機ハンドルをグループ化し、一連の操作をブロックできます.などを投票できます。

Silverlight の ASR が IAsyncResult を使用しないのはなぜですか? 私の推測では、設計者は実際には完全な非同期性が必要であることを明確にしたかったためであり、IAsyncResult デザイン パターンを使用していた場合、Begin をすぐに呼び出してから End を呼び出すことを試みるのはあまりにも簡単だったでしょう。ほぼ 100% の新しい開発者や、async をよく理解していない人々がぶつかるつまずきのブロックです。

4

2 に答える 2

5

Silverlight チームは、イベント ベースの非同期パターンへの即時アクセスを提供しました。これは、アプローチが使いやすいためです (ただし、柔軟性は大幅に低下します)。たとえば、イベントは表示スレッドで発生するため、開発者はスレッド モデルについて考えたくないので、それを忘れることができます。

より高い柔軟性が必要な場合 (私のように)、Begin/End async パターンも Silverlight で利用できます。実際、イベント ベースで生成されたコードは IAsyncResult に基づいています。

生成された Channel インターフェイスは begin/end メソッドを定義し、チャネル ファクトリを使用してインターフェイスの使用可能な実装を取得できます。

于 2011-03-21T23:33:01.663 に答える
2

MSDNから:

通常、前述のイベント ベースの非同期モデルでは、サービスが呼び出されたスレッドと同じスレッドで完了イベントが発生します。これは、UI (ユーザー インターフェイス) スレッドからサービスを呼び出すことが多く、完了イベント ハンドラーで直接 UI コンポーネント (この例のテキスト ボックスなど) を更新できるため、多くのアプリケーションで便利です。

完了イベントをバックグラウンド スレッドで処理したい場合があります。このため、またはその他の理由で、IAsyncResult メカニズムと Begin/End メソッドに基づく代替の非同期呼び出しモデルを使用することが必要な場合があります。

このモデルを使用するには、まずプロキシを適切なインターフェイス タイプにキャストする必要があります。インターフェイス タイプは、[サービス参照の追加] ツールによってプロキシと共に自動的に生成されます。その後、適切な Begin メソッドを呼び出すことができます。

CopyIAsyncResult iar = ((CustomerService)proxy).BeginGetUser(userId, GetUserCallback, proxy);

MSDN リンクを提供してくれた Kimberly に感謝します。

于 2011-03-21T23:37:54.580 に答える