6

MSDN のドキュメントやコード サンプルを読んでいると、いくつかの用語に混乱します。

C# のコールバックとは何ですか? 特に、同期コールバックと非同期コールバックとは何ですか?

これらを素人目線で教えてください。

また、IAsyncCallback IAsyncResultインターフェースについても教えてください。どうすれば実装できますか?(非常に簡単な例で)

前もって感謝します。

4

3 に答える 3

14

インターフェイスが存在しないため、IAsyncCallback実装できません。

IAsyncResultあなたは実際にインターフェースについて知りたいと思っていると思います。

MSDN のこのページを読むことをお勧めします。


IAsyncResultインターフェイスは、コードの実行中にバックグラウンドで実行される操作 (Web 要求やデータベース呼び出しなど) を表します。操作が完了したかどうか (IsCompletedプロパティ) がわかります。また、操作が完了するまで待機するために使用できるWaitHandleオブジェクト(プロパティ) も提供します。AsyncWaitHandle(電話でresult.AsyncWaitHandle.WaitOne()

IAsyncResultメソッドを呼び出して取得しますBeginWhatever。( BeginExecuteReaderBeginGetResponse、およびその他多数)。このBeginWhateverメソッドは、操作に必要なすべてのパラメーターを受け取り (たとえばBeginExecuteReaderCommandBehaviorパラメーターを受け取ることができます)、AsyncCallback デリゲート (インターフェイスではない) と状態パラメーターを受け取ることができます。In はオブジェクトを返しIAsyncResultます。

AsyncCallback デリゲートはユーザーが指定するメソッドであり、操作が終了したときに呼び出されます。通常は別のスレッドで呼び出されるため、注意が必要です。AsyncCallback メソッドには、BeginWhateverメソッドが以前に与えたのと同じ IAsyncResult が与えられます。状態パラメーターは IAsyncResult に入れられ、システムによって無視されます。AsyncCallback メソッドで使用して、操作の目的を追跡できます。(状態は、 を含め、好きなようにすることができますnull)

AsyncCallback 内 (または他の場所) で、最初に呼び出したEndWhateverメソッドに対応するメソッドを呼び出すことができますBeginWhatever。AsyncCallback から、または AsyncCallback からIAsyncResult を渡す必要がありますBeginWhatever。これを呼び出すと、操作が完了するまで待機し (まだ完了していない場合)、操作の結果が返されます。(操作が何かを返すと仮定します。たとえば、WebRequest.EndGetResponsea が返されますWebResponse)。操作中にエラーが発生した場合はEndWhatever、例外がスローされます。


バックグラウンドで実行できる独自の操作を作成する場合は、IAsyncResult を実装します。また、それを返すメソッドと受け取るメソッドをそれぞれ作成BeginWhateverします。EndWhateverIAsyncResult の実装の詳細については、こちらを参照してください。

于 2009-08-30T19:40:37.330 に答える
5

同期コールバックでは、呼び出し元のメソッド (またはスレッド) は、呼び出し先のメソッドが完了するまで待機してから処理を続行する必要があります。これは、「通常の」メソッド呼び出しと同様です。

非同期コールバックを使用すると、呼び出し元のメソッド (またはスレッド) は、呼び出されたメソッドの完了を待たずに、他の入力やイベントなどの処理を続行できます。

アプリケーションが長いプロセスを実行している間にアプリケーションのユーザー インターフェイス スレッドを「フリーズ」させたくない場合は、非同期コールバックを使用する必要があります。

于 2009-08-30T19:47:10.640 に答える
3

コールバックはデリゲートにすぎません。コールバックという用語が使用されるのは、通常、それ (デリゲート) をメソッドに (引数として) 渡し、そのメソッドで呼び出されて何かを通知するためです。

同期および非同期コールバックがそれです。同期、メソッドを呼び出した (アクションを開始した) 同じスレッドで実行します。非同期は通常、別のスレッドで実行されます (常にではありません)

IAsyncCallback インターフェイスは、非同期タスクを開始するためのテンプレートです。作業が完了したときに呼び出されるコールバック (デリゲート) を渡します。メソッドが同期的に実行されるかどうかを決定するプロパティがあります。

于 2009-08-30T19:26:40.057 に答える