趣味は車輪の再発明♪

ワーカースレッドからUI更新 - [ マルチスレッド / C# ]


「小さな小さなサンプル&スニペット」
▲インデックスへ戻る▲
カテゴリ:「マルチスレッド」

メインスレッドで生成されたユーザーインタフェースオブジェクトを、別のスレッドから更新する際の記述方法を示します。ワーカースレッドから直接ユーザーインタフェースの更新を行えないGUIフレームワークが対象です。

public partial class Form1 : Form {

    // ・
    // ・
    // ・

    //タイマーイベントはフォームを作成したスレッドとは別のスレッドから
    //呼び出されるため、フォーム上のコントロールの状態を操作するには、
    //Invokeメソッドを使用します。
    private void Timer1_Tick(object sender, EventArgs e) {

        //処理内容を記述した無名delegateをMethodInvokerにキャストし、
        //Invokeメソッドに処理の実行を依頼します。
        Invoke((MethodInvoker)delegate {
            PictureBox1.Image = bitmap;
        });
    }

    // ・
    // ・
    // ・

}		

フォームを生成したスレッド(通常はメインスレッド)とは別のスレッドから、フォームやフォーム上のコントロールを操作できません。 サブスレッドからのイベントでフォームのUIを更新する場合に問題になります。
このような場合は、フォームのInvokeか、BeginInvokeメソッドで、メインスレッドで処理を実行してもらうように依頼します。

Invokeはメインスレッドをブロックして、その場で(同期的に)実行します。BeginInvokeは非同期で実行可能になった時に処理されます。

カテゴリ「マルチスレッド」の他のエントリ:
| スレッド終了 | スレッド開始 |



RSS Feed Widget
ワーカースレッドからUI更新 - [ マルチスレッド / C# ] 」 (http://bicycle.life.coocan.jp/takamints/index.php/snippets/snippet/mt/invokemain/cs)
by Koji Takami ( email: vzg03566@gmail.com, GitHub: takamin )