マルチスレッドでフォームコントロールにアクセス


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

メインスレッド以外からフォームコントロールにアクセスするには、
delegateとInvokeメソッドを使います。

// こいつが噂のデリゲート
delegate void delegateHoge(string str);

// フォームにアクセスするメソッド
private void HogeHoge(string str){
    if(textBox1.InvokeRequired){
        delegateHoge d = new delegateHoge(HogeHoge);
        object[] obj = {str};
        Invoke(d, obj);
    }else{
        textBox1.Text = str;
    }
}

// スレッド処理
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) {
    HogeHoge("ほげー");
}

簡単に説明すると、
if(textBox1.InvokeRequired){
の部分でメインスレッドなのかを判別して、必要な場合にInvokeメソッドを
使って、メインスレッドに処理をさせるようにしています。
イメージとしては、最初にマルチスレッド側でifの中が呼び出され、
その後、メインスレッドがelseの中を実行するイメージです。
HogeHogeの先頭でブレークをかけると、2回呼び出されるのが確認できると思います。



引数が無いようなメソッドだと、もう少し簡略化できます。
ほとんど同じですがね。

// こいつが噂のデリゲート
delegate void delegateHoge();

// フォームにアクセスするメソッド
private void HogeHoge(){
    if(textBox1.InvokeRequired){
        Invoke(new delegateHoge(HogeHoge));
    }else{
        textBox1.Text = "ほげー";
    }
}

// スレッド処理
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) {
    HogeHoge();
}
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。