2016-05-15 4 views
0

Ich habe 2 Formulare auf verschiedenen Threads ausgeführt. Form2 generiert eine Zeichenfolge, sendet sie an form1 zurück und aktualisiert die richtextbox in form1. Ich habe den Code von meinem Freund bekommen, aber ich verstehe einen Teil davon nicht.C# Fragen zu Invoke, Invereequired & Multithreading

Könnten Sie mir bitte erklären, warum brauchen wir die Bedingung:

if (this.f1_rtb_01.InvokeRequired) { } 

Und was 2 Zeilen unten tun?

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

Voll-Code 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

Warum führen Sie zwei Formulare auf zwei Threads aus? –

Antwort

1

Dieser Teil:

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

die aktuelle Form bewirkt eine Instanz der SetTextCallback Delegierten aufzurufen, die Variable vorbei text als Parameter. Die Delegat-Instanz verweist auf die Methode SetText(), die aufgrund des Aufrufs this.Invoke() im selben Thread wie das Formular ausgeführt wird.

Aufruf wird verwendet, um die Ausführung von Code aus einem Hintergrundthread in den Thread eines Formulars/Steuerelements zu verschieben, wodurch die Ausführung threadsicher wird.

Dieser Teil nur für die Kontrolle, wenn Sie aufrufen müssen:

if (this.f1_rtb_01.InvokeRequired) 

Wenn Sie nicht das bedeutet aufzurufen erforderlich, dass der Code läuft bereits auf die Form des oder Threads Kontrolle, und wird ein Wurf Ausnahme, wenn Sie versuchen, aufzurufen.

1

Jede Form läuft auf einem anderen Thread. Lass uns sie thread1 und thread2 nennen. Da Sie etwas in Thread2 von Thread1 aktualisieren möchten, müssen diese beiden Threads miteinander kommunizieren. Und das ist invoke 's Job

die Bedingung ist zu prüfen, ob oder nicht erforderlich ist. Wenn Sie die Zeichenfolge in Thread1 in Thread1 selbst aktualisieren, ist kein Aufruf erforderlich, andernfalls ist dies der Fall.