2009-03-19 14 views

答えて

2

これは、BeginInvokeを呼び出すオブジェクトのタイプによって異なります。

ISynchronizeInvokeは、BeginInvokeを定義するインターフェイスです。そのインターフェイスを実装するオブジェクトにデリゲートを渡し、そのオブジェクトは自身のメインスレッド上で実行されるようにスレッドをスケジューリングします(必要があります)。

このインターフェイスを実装するオブジェクトがいくつかあります。 WPFのディスパッチャはこれを行います。ディスパッチャでBeginInvokeを呼び出すと、デリゲートがディスパッチャのキューに追加され、適切なときに実行されます。

Windowsフォームのコントロールの基本クラスもISynchronizeInvokeを実装しています(これはあなたの質問が示唆しているものかもしれません)。 Windowsフォームでは、物事ははるかに複雑です。詳細を説明しているHere is a great article。基本的に、winformsコントロールでBeginInvokeを呼び出すと、特別なマーシャラがプログラムに渡されるWindowsメッセージを作成し、UIスレッドがデリゲートを実行するようにキューに入れるということが起こります。これは、それより少し複雑です(この記事で説明しています)が、それは基本的な考え方です。デリゲートはメインUIスレッド上で実行されます。

ISynchronizeInvokeを実装する他のオブジェクトがありますが、そのほとんどは独自のスレッドを管理して実行しているオブジェクトです。これらのオブジェクトは、デリゲートのキューを維持し、そのスレッドで実行するようにキューに追加します。

関連する問題