MSDN のドキュメントやコード サンプルを読んでいると、いくつかの用語に混乱します。
C# のコールバックとは何ですか? 特に、同期コールバックと非同期コールバックとは何ですか?
これらを素人目線で教えてください。
また、IAsyncCallback IAsyncResult
インターフェースについても教えてください。どうすれば実装できますか?(非常に簡単な例で)
前もって感謝します。
MSDN のドキュメントやコード サンプルを読んでいると、いくつかの用語に混乱します。
C# のコールバックとは何ですか? 特に、同期コールバックと非同期コールバックとは何ですか?
これらを素人目線で教えてください。
また、IAsyncCallback IAsyncResult
インターフェースについても教えてください。どうすれば実装できますか?(非常に簡単な例で)
前もって感謝します。
インターフェイスが存在しないため、IAsyncCallback
実装できません。
IAsyncResult
あなたは実際にインターフェースについて知りたいと思っていると思います。
MSDN のこのページを読むことをお勧めします。
IAsyncResult
インターフェイスは、コードの実行中にバックグラウンドで実行される操作 (Web 要求やデータベース呼び出しなど) を表します。操作が完了したかどうか (IsCompleted
プロパティ) がわかります。また、操作が完了するまで待機するために使用できるWaitHandle
オブジェクト(プロパティ) も提供します。AsyncWaitHandle
(電話でresult.AsyncWaitHandle.WaitOne()
)
IAsyncResult
メソッドを呼び出して取得しますBegin
Whatever
。( BeginExecuteReader
、BeginGetResponse
、およびその他多数)。このBegin
Whatever
メソッドは、操作に必要なすべてのパラメーターを受け取り (たとえばBeginExecuteReader
、CommandBehavior
パラメーターを受け取ることができます)、AsyncCallback デリゲート (インターフェイスではない) と状態パラメーターを受け取ることができます。In はオブジェクトを返しIAsyncResult
ます。
AsyncCallback デリゲートはユーザーが指定するメソッドであり、操作が終了したときに呼び出されます。通常は別のスレッドで呼び出されるため、注意が必要です。AsyncCallback メソッドには、Begin
Whatever
メソッドが以前に与えたのと同じ IAsyncResult が与えられます。状態パラメーターは IAsyncResult に入れられ、システムによって無視されます。AsyncCallback メソッドで使用して、操作の目的を追跡できます。(状態は、 を含め、好きなようにすることができますnull
)
AsyncCallback 内 (または他の場所) で、最初に呼び出したEnd
Whatever
メソッドに対応するメソッドを呼び出すことができますBegin
Whatever
。AsyncCallback から、または AsyncCallback からIAsyncResult を渡す必要がありますBegin
Whatever
。これを呼び出すと、操作が完了するまで待機し (まだ完了していない場合)、操作の結果が返されます。(操作が何かを返すと仮定します。たとえば、WebRequest.EndGetResponse
a が返されますWebResponse
)。操作中にエラーが発生した場合はEnd
Whatever
、例外がスローされます。
バックグラウンドで実行できる独自の操作を作成する場合は、IAsyncResult を実装します。また、それを返すメソッドと受け取るメソッドをそれぞれ作成Begin
Whatever
します。End
Whatever
IAsyncResult の実装の詳細については、こちらを参照してください。
同期コールバックでは、呼び出し元のメソッド (またはスレッド) は、呼び出し先のメソッドが完了するまで待機してから処理を続行する必要があります。これは、「通常の」メソッド呼び出しと同様です。
非同期コールバックを使用すると、呼び出し元のメソッド (またはスレッド) は、呼び出されたメソッドの完了を待たずに、他の入力やイベントなどの処理を続行できます。
アプリケーションが長いプロセスを実行している間にアプリケーションのユーザー インターフェイス スレッドを「フリーズ」させたくない場合は、非同期コールバックを使用する必要があります。
コールバックはデリゲートにすぎません。コールバックという用語が使用されるのは、通常、それ (デリゲート) をメソッドに (引数として) 渡し、そのメソッドで呼び出されて何かを通知するためです。
同期および非同期コールバックがそれです。同期、メソッドを呼び出した (アクションを開始した) 同じスレッドで実行します。非同期は通常、別のスレッドで実行されます (常にではありません)
IAsyncCallback インターフェイスは、非同期タスクを開始するためのテンプレートです。作業が完了したときに呼び出されるコールバック (デリゲート) を渡します。メソッドが同期的に実行されるかどうかを決定するプロパティがあります。