サブスレッドからの戻り(イベントの発生)を受け、メインスレッドへ表示させるにはInvokeが必要かInvokeRequiredで判定し、必要ならばInvoke,MethodInvokerを使用します。
先ずは、サンプル・・・フォームにはラベルとボタンが貼りついてます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
using System; using System.Windows.Forms; namespace strudy_deligate { public partial class FormInvoke : Form { private 別スレッド 別スレッド; public FormInvoke() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { 別スレッド = new 別スレッド();//スレッドの生成(コンストラクタで別スレッドが動き始めます) //発生メソッドのイベント発生したら、イベント受信処理を行います。→イベントハンドラの追加 別スレッド.別スレッドイベント発生.発生メソッド += new 別スレッドイベント発生.イベントハンドラ(this.イベント受信処理); } //ファームに出力するデータを出力できる様にして、データを表示する private void Invoke表示パターン(int num, string message) { if (this.InvokeRequired)//Invokeする必要があるかを判定 { //必要ならばInvokeメソッドとMethodInvokerデリゲートを利用してFormがデUIデータ処理できる様にする。 this.Invoke((MethodInvoker)delegate () { Invoke表示パターン(num, message); });//自身の関数に再帰させるだけで処理ができる様になるおまじない。 return; } else//最終的に、ここにデータを流しFormへ表示する。 { this.label1.Text = "num=" + num + "message=" + message;//結果表示 } } private void イベント受信処理(int num, string message)//コールバック { Invoke表示パターン(num, message);//処理 } } public class 別スレッド { public 別スレッドイベント発生 別スレッドイベント発生; private int i; public 別スレッド() { 別スレッドイベント発生 = new 別スレッドイベント発生(); // タイマーイベントで定期的にイベントを発生させる var timer1 = new System.Timers.Timer(1000); timer1.Enabled = true;//タイマーイベント・スタート timer1.Elapsed += (sender, e) =>//タイマーイベントの受信 { DateTime dt = DateTime.Now; i++; string si = i.ToString(); string sd = dt.ToString("yyyy/MM/dd (ddd) HH:mm:ss" + "\n"); Console.WriteLine("i =" + si + "sd=" + sd); //タイマーイベントの受信毎にイベントを発生させます 別スレッドイベント発生.発生(i, sd); }; } } public class 別スレッドイベント発生 { //デリゲートの宣言 //戻り値無しで引数をint型、string型とする。 public delegate void イベントハンドラ(int number, string message); //ここでは"イベントハンドラ"という「イベントデリゲート」を宣言する public event イベントハンドラ 発生メソッド;//発生メソッドの実体をコールするとイベントが発生する事になります。 public void 発生(int num, string message)//イベント発生メソッド { 発生メソッド(num, message);//イベントの発生 } } } |
public class 別スレッドイベント発生・・・イベントを発生させる為のクラスです。
public class 別スレッド・・・Invokeを使いFormへデータを表示させる為のスレッドです。
public partial class FormInvoke・・・Formのメインスレッドです。