まず、この質問にはwinformsやwpfなどの GUI 固有のタグが付けられていないことに注意してください。すぐにわかるように、これは意図的なものです。
第二に、この質問がやや長い場合は申し訳ありません。あちこちに散らばっているさまざまな情報を集めて、価値のある情報を提供するようにしています。ただし、私の質問は「知りたいこと」のすぐ下にあります。
私は最終的に、特定のスレッドでデリゲートを呼び出すために .NET によって提供されるさまざまな方法を理解することを使命としています。
私が知りたいこと:
特定のスレッドでデリゲートを呼び出すための最も一般的な方法 (Winforms または WPF 固有ではない) を探しています。
または、別の言い方をすると、これを行うためのさまざまな方法 (WPF
Dispatcher
を使用するなど) が相互に利用されているかどうか、およびその方法に興味があります。つまり、クロススレッド デリゲート呼び出しに共通のメカニズムが 1 つあり、それが他のすべてのメカニズムで使用されている場合です。
私がすでに知っていること:
このトピックに関連する多くのクラスがあります。その中で:
SynchronizationContext
(中System.Threading
)
私が推測しなければならないとしたら、それは最も基本的なものでしょう。正確に何をするのか、どのように使用されるのかはわかりませんが。AsyncOperation
& (in ) これらは のラッパーのようです。それらを使用する方法の手がかりはありません。AsyncOperationManager
System.ComponentModel
SynchronizationContext
WindowsFormsSynchronizationContext
(中System.Windows.Forms
)
のサブクラスSynchronizationContext
。ISynchronizeInvoke
(中System.ComponentModel
)
Windows フォームで使用されます。(Control
クラスはこれを実装しています。推測する必要がある場合、この実装は を利用していると思いますWindowsFormsSynchronizationContext
。)Dispatcher
& (in ) 後者は の別のサブクラスのようで、前者はそれに委譲されています。DispatcherSynchronizationContext
System.Windows.Threading
SynchronizationContext
一部のスレッドには、メッセージ キューと共に独自のメッセージ ループがあります。
(MSDN のページAbout Messages and Message Queuesには、メッセージ ループがシステム レベルでどのように機能するか、つまり Windows API としてのメッセージ キューに関する入門的な背景情報があります。)
メッセージ キューを使用してスレッドのクロススレッド呼び出しを実装する方法がわかります。
PostThreadMessage
Windows API を使用すると、デリゲートを呼び出す命令を含む特定のスレッドのメッセージ キューにメッセージを入れることができます。そのスレッドで実行されるメッセージ ループは最終的にそのメッセージに到達し、デリゲートが呼び出されます。MSDN で読んだことから、スレッドは自動的に独自のメッセージ キューを持ちません。メッセージキューは、スレッドがウィンドウを作成したときなどに利用可能になります。メッセージ キューがなければ、スレッドにメッセージ ループがあっても意味がありません。
では、ターゲット スレッドにメッセージ ループがない場合、クロススレッド デリゲート呼び出しはまったく可能でしょうか? たとえば、.NET コンソール アプリケーションではどうでしょうか。(この質問への回答から判断すると、コンソールアプリでは確かに不可能だと思います。)