2016-05-15 13 views
0

2つのフォームが異なるスレッドで動作しています。 Form2は文字列を生成し、それをform1に送り、form1のrichtextboxを更新します。私は友人からコードを受け取りましたが、私はその一部を理解していません。C#Invoke、Invokerequired&Multithreadingに関する質問

if (this.f1_rtb_01.InvokeRequired) { } 

そして、以下の2行を何をしますか:我々は条件が必要なのか、なぜ

あなたは私に説明してもらえますか?

SetTextCallback d = new SetTextCallback(SetText); 
this.Invoke(d, new object[] { text }); 

完全なコードをForm1:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.Threading; 

namespace PassingData2Forms 
{ 
public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    public string str_1; 

    private void call_form_2() 
    { 
     for (int i = 0; i < 10; i++) 
     { 
      Form2 inst_form2 = new Form2(); 
      inst_form2.ShowDialog(); 

      string result = inst_form2.SelectedString; 
      this.SetText(result); 
     } 
    } 

    delegate void SetTextCallback(string text); 

    private void SetText(string text) 
    { 
     if (this.f1_rtb_01.InvokeRequired) 
     { 
      SetTextCallback d = new SetTextCallback(SetText); 
      this.Invoke(d, new object[] { text }); 
     } 
     else 
     { 
      if (text != "") 
      { 
       this.f1_rtb_01.AppendText(text + Environment.NewLine); 
      } 
      else 
      { 
       this.f1_rtb_01.AppendText("N/A" + Environment.NewLine); 
      } 
     } 
    } 

    private void f1_but_01_Click(object sender, EventArgs e) 
    { 
     Thread extra_thread_01 = new Thread(() => call_form_2()); 
     extra_thread_01.Start();    
    } 
} 
} 
+1

2つのスレッドで2つのフォームを実行しているのはなぜですか? –

答えて

1

この部分:

SetTextCallback d = new SetTextCallback(SetText); 
this.Invoke(d, new object[] { text }); 

パラメータとして変数textを渡し、SetTextCallbackデリゲートのインスタンスを起動するために現在のフォームを引き起こします。デリゲートインスタンスは、SetText()メソッドを指しています。これは、this.Invoke()を呼び出すため、フォームと同じスレッドで実行されます。

呼び出しは、コードの実行をバックグラウンドスレッドからフォーム/コントロールのスレッドに移動するために使用されるため、実行がスレッドセーフになります。

この部分で、ちょうどあなたが呼び出すために必要な場合にチェックする:

if (this.f1_rtb_01.InvokeRequired) 

あなたはそのコードがすでにフォームのか、コントロールのスレッドで実行されていることを意味し起動する必要はありません、とスローされます場合はあなたが呼び出しようとすると例外です。

1

各フォームには別のスレッドで実行されます。スレッド1とスレッド2を呼び出します。 thread1からthread2のものを更新したいので、お互いに通信するにはこれらの2つのスレッドが必要です。それはinvokeの仕事です。

条件は、呼び出しが必要かどうかをチェックすることです。 thread1自体のthread1の文字列を更新している場合は、それ以外の場合は呼び出す必要はありません。