2009-04-20 5 views
10

私は(私は今、GUIスレッドからGUIを操作するメソッドを呼び出すためのワーカースレッドから呼び出しを検討しています)動作することができますC#のInvoke機能することが可能である方法を知りたい:Invokeはどのように下に動作しますか?スレッドには命令ポインタが1つしかありませんか?

は、私は2つのスレッドを持っていると仮定し、それぞれの命令には現在実行されている命令を指す命令ポインタがあります。

今、私はGUIスレッドでデリゲートを実行するためにワーカースレッドでInvokeを呼び出します。 GUIスレッドがすでに命令ポインタ(IP)を持っていて、各スレッドがそれを持つことができる場合、これはどのように可能ですか? 突然コードを呼び出すと、そのIPはどうなりますか? GUIスレッドは、それが何をしていたとしても後で続けることができます(以前のIPは何とか復元されました)?

私はfは()いくつか のスレッドのコンテキストで実行されるような方法で、スレッド1からの関数f()を呼び出したいとき、この質問の

一般化は、それが行われているか ...

啓発に感謝します:)!

答えて

10

ターゲットスレッドにウィンドウメッセージを送信します。 Invokeを動作させるにはスレッドがメッセージループ内になければなりません。スレッドがメッセージを取得すると、スレッドはデリゲートを呼び出します。

スレッド間のIP変更は必要ありません。実際には、IPを変更するとターゲットスレッドがほぼ確実にクラッシュします。

+2

答えは正しいですが、明らかにすると、それは送信されるウィンドウメッセージです。そのため、UIスレッドメッセージポンプが実行されると、メッセージが取得され処理されます。 – Lucero

+0

実際には、ランタイムは実行中のスレッドを積極的に先取りして独自のことを行うことができる状況もあります。私は詳細については明確ではない。これらのうちの少なくとも1つはガベージコレクションを呼び出すことを含みますが、他にもガベージコレクションが存在する可能性があります – Promit

+2

ありがとうございます。対象のスレッドがビジー状態のときは、スレッドが処理を終了してメッセージの処理を開始した後にのみメソッドを呼び出すことができます。そして、これのための手段は、いくつかのペイロードにデリゲートパラメータを持つWindowsメッセージです。 ありがとう、私は答えをGoogleにしようとしたが、どこにでも 'ちょうどInvokeを追加すると、あなたはチュートリアルのみです... –

関連する問題