2

同じデリゲートインスタンスで複数回呼び出すBeginInvokeと問題が発生すると思いましたが、試してみましたが、うまくいきました。何故ですか?

IAsyncResultオブジェクトは、デリゲートの各インスタンスではなく、一意と呼ばれるそれぞれで返されますBeginInvokeか?

つまり、デリゲートの1つのインスタンスだけで、その関数への複数の呼び出しを生成できますか?

4

4 に答える 4

3

なぜそれが機能しないのでしょうか?呼び出すたびに、スレッドプールスレッドでそのデリゲートのアクションの実行が開始されます。はい、それぞれIAsyncResultが他から独立しており、その非同期アクションを表しています。

はい、デリゲートのインスタンスは1つだけ必要です。デリゲートは不変であることに注意してください。呼び出しBeginInvokeによって状態が変わることはありません。デリゲート参照のコピーを安全に取得できます。呼び出しなどによって、既存のデリゲートインスタンスを変更するのではなく、Delegate.Combine常に新しいデリゲートインスタンスが作成されることを知っていれば安全です。

于 2010-03-10T15:33:32.977 に答える
3

を呼び出すたびBeginInvokeに、.netスレッドプールへの新しいリクエストがトリガーされます。

BeginInvoke複数回呼び出すことは完全に許容されます。各IAsyncResultオブジェクトは、への特定の呼び出しに固有BeginInvokeです。

リソースがクリーンアップされていることを確認するために、行うEndInvokeすべての呼び出しに対して一致する呼び出しを行うように注意してください。BeginInvoke

(各呼び出しは必ずしもスレッドと同じではないことに注意してください。BeginInvoke要求をスレッドプールに渡します。プール内のすべてのスレッドがすでに使用されている場合は、要求がキューに入れられる可能性があります)

于 2010-03-10T15:34:08.213 に答える
1

たとえば、すべてのスレッドが同じタスクを実行するように、複数のスレッドが同じデリゲートインスタンスを呼び出す場合があります。

于 2010-03-10T15:33:02.993 に答える
1

はい。

を呼び出すたびBeginInvokeに異なるが返され、任意の順序IAsyncResultで渡すことができます。EndInvoke

同じデリゲートを使用して、複数の非同期呼び出しを行うことができます。

于 2010-03-10T15:33:51.677 に答える