デリゲート型の変数でBeginInvokeを呼び出すと、内部的にはどうなりますか?スレッドで使用されるデリゲート?
1
A
答えて
2
これは、BeginInvokeを呼び出すオブジェクトのタイプによって異なります。
ISynchronizeInvokeは、BeginInvokeを定義するインターフェイスです。そのインターフェイスを実装するオブジェクトにデリゲートを渡し、そのオブジェクトは自身のメインスレッド上で実行されるようにスレッドをスケジューリングします(必要があります)。
このインターフェイスを実装するオブジェクトがいくつかあります。 WPFのディスパッチャはこれを行います。ディスパッチャでBeginInvokeを呼び出すと、デリゲートがディスパッチャのキューに追加され、適切なときに実行されます。
Windowsフォームのコントロールの基本クラスもISynchronizeInvokeを実装しています(これはあなたの質問が示唆しているものかもしれません)。 Windowsフォームでは、物事ははるかに複雑です。詳細を説明しているHere is a great article。基本的に、winformsコントロールでBeginInvokeを呼び出すと、特別なマーシャラがプログラムに渡されるWindowsメッセージを作成し、UIスレッドがデリゲートを実行するようにキューに入れるということが起こります。これは、それより少し複雑です(この記事で説明しています)が、それは基本的な考え方です。デリゲートはメインUIスレッド上で実行されます。
ISynchronizeInvokeを実装する他のオブジェクトがありますが、そのほとんどは独自のスレッドを管理して実行しているオブジェクトです。これらのオブジェクトは、デリゲートのキューを維持し、そのスレッドで実行するようにキューに追加します。
関連する問題
- 1. CheckForIllegalCrossThreads、スレッド&デリゲート - ウィンドウモバイル
- 2. (メッセージポンプを使用して)uiスレッドでデリゲートを実行します。
- 3. ランタイムで作成されたデリゲートとオブジェクトを使用する
- 4. デリゲートの使用中にエラーが表示される
- 5. スレッド内でデリゲートを使用中にinvalidOperationExceptionが発生しました
- 6. ストーリーボードのtabBarControllerでデリゲートを使用する
- 7. イベントでデリゲートを使用する
- 8. EXC_BAD_ACCESS ARCでデリゲートを使用するNSXMLParser
- 9. Swiftで使用されるスレッドは何ですか?
- 10. JVMで使用されるスレッドの数を制限する
- 11. C#のFuncデリゲートだからスレッド例外
- 12. 他のスレッドで作成されたオブジェクトを使用する
- 13. 単純なデリゲートの使用
- 14. vb.netのデリゲートを使用
- 15. OS Xのデリゲートの使用
- 16. C#でのデリゲートの使用例#
- 17. IEでアンカーを使用したjqueryデリゲート
- 18. Carbon Objective C++アプリケーションでCocoaデリゲートを使用
- 19. もっと使いやすい方法デリゲートをデリゲートするデリゲート
- 20. pthreadsで作成されたスレッドでTCPDFを使用
- 21. デリゲートを使用するViewController間のメッセージ
- 22. イベントハンドラ対デリゲートを使用する
- 23. さまざまなパラメータを持つデリゲートを使用する
- 24. デリゲートされたコンストラクタを使用している間のメンバの初期化
- 25. 一般的に型付けされたデリゲートとインターフェイスにリフレクションを使用する
- 26. スレッドを使用すると重複が印刷されるC++
- 27. ネストされたデリゲート/デリゲート内のviewDidLoad()の実装
- 28. ネットワークデータの送信に使用されるAndroidスレッドの最適化
- 29. デリゲートを使用する(または使用しない)場合
- 30. ThreadPoolTaskExecutorとJMSで使用されるスレッドは1つだけです