2

Hans によるこの質問と回答を読んでいましたが、まだ説明が必要です。

私の知る限り 、

非同期メソッドの目的は、多くのタスクを少数のスレッドで実行できるようにすることです。一方、非同期デリゲートの目的は、呼び出し元と並行してタスクを実行することです。

しかし、両方の非同期操作に関して:

呼び出し元にすぐBeginInvokeに戻る場合(そして Asynchronous delegateを使用する場合)、実際にジョブを実行し、終了時に通知する他のスレッドが必要です。

では、そのスレッドを通常のスレッドプールスレッドに使用することの違いは何ですか? そして私は答えます: それらのスレッドプールのスレッドが既にそこにあり、実行されるのを待っているという事実だけですか?

しかし、BeginInvoke実行してすぐに戻ったときに、他の誰か実際に汚い仕事をしているという事実はどうですか(そして、コードは処理中のスレッドの下で実行する必要があります) 電話)

私は何が欠けていますか?

4

2 に答える 2

2

Delegate.BeginInvokeと同じように、スレッドプールスレッドを使用しますQueueUserWorkItem。違いは、APMパターンを実装していることです。これにより、呼び出し元はaを使用しWaitHandleて呼び出しが終了するのを待機し、コールバックも提供できます。

Begin / Endメソッドペア(別名非同期プログラミングモデル)は多くの場所で見つけることができ、「begin」を呼び出したときに何が起こるかを決定するのは完全に実装者次第です。多くの場合、IO完了ポートが使用されます。これは、IOが完了するのを待つための非常に効率的な方法です。IOが完了すると、コールバックの実行にスレッドプールスレッドが使用されますが、スレッドプールの別の部分から取得されます(そのため、Set {Min、Max}スレッドには2つの数値があります)。

ちなみに、.NET 4.5(および4.0)では、非同期にタスクを使用する方がはるかに簡単です。多くのクラスは、オブジェクトを返す「XXXTaskAsyc」のようなメソッドで拡張されていTaskます。

于 2013-03-12T08:20:11.287 に答える
1

あなたはすでに答えを自分で得ているようです。 -thread をBeginInvoke使用して作業を行います。Threadpool結局、作業項目を自分でスレッドプールにキューに入れるのと何ら変わりはないようです。唯一のことは、あなたが直面している抽象化のレベルが高いということです。実際には、コード内でコールバックを明示的にキューに入れたり提供したりすることには関心がありません。
これは既に見た。アイデアについては、SO here を参照してください。

于 2013-03-12T08:13:43.980 に答える