Adsense

2015年8月23日日曜日

【C#】バックグラウンドワーカーから画面コントロールの操作を行う(別スレッドの操作)

フォーム側のスレッドと異なるスレッドでは当然[this.txtBox.Text]等の形で値を取得したり、セットすることはできない。
その場合Invokeメソッドを使用しフォーム側のスレッドでメソッドを実行しコントロールの操作を行う。
フォームのコントロール操作はフォーム側のスレッドで行われるので注意する。

以下、Invokeメソッドを使用したメソッドの呼び出しによるフォーム上のコントロールの取得とセットの例。

■ソースコード
ダウンロード:http://www.geocities.jp/battlescouter/zip/invoke.zip

■画面


例:backgroundWorker.DoWorkのタイミングでテキストボックスの値を取得、別のテキストボックスにセットする。

■デザイナ


■コード
  1. using System;
  2. using System.ComponentModel;
  3. using System.Windows.Forms;
  4. namespace invoke
  5. {
  6.     public partial class Form1 : Form
  7.     {
  8.         //値取得用デリゲート
  9.         delegate string dlgGetText();
  10.         delegate void dlgSetText(string set);
  11.         public Form1()
  12.         {
  13.             InitializeComponent();
  14.             // バックグラウンド処理メソッド追加
  15.             //DoWork:メソッド追加
  16.             this.backgroundWorker1.DoWork +=
  17.              new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker1_DoWork);
  18.         }
  19.         private void btnStart_Click(object sender, EventArgs e)
  20.         {
  21.             //バックグラウンドDoWork処理開始
  22.             this.backgroundWorker1.RunWorkerAsync();
  23.         }
  24.         private string getText()
  25.         {
  26.             //テキストボックス1の値を取得する
  27.             return this.textBox1.Text;
  28.         }
  29.         private void setText(string setString)
  30.         {
  31.             //引数値をテキストボックス2にセットする
  32.             this.textBox2.Text = setString;
  33.         }
  34.         private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
  35.         {
  36.             string get;
  37.             //テキストボックス1の値を取得する
  38.             get = Invoke(new dlgGetText(getText)).ToString();
  39.             
  40.             //取得した値をテキストボックス2にセットする
  41.             Invoke(new dlgSetText(setText), new object[] {get});
  42.         }
  43.     }
  44. }

0 件のコメント:

コメントを投稿