2016-05-15 3 views
0

У меня есть две формы, работающие на разных потоках. Form2 будет генерировать строку, отправить ее обратно в form1 и обновить richtextbox в form1. Я получил код от своего друга, но я не понимаю его часть.C# Вопросы, касающиеся Invoke, Invokerequired и многопоточности

Не могли бы вы объяснить мне, почему нам нужно условие:

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

Почему вы используете две формы на двух потоках? –

ответ

1

Эта часть:

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

вызывает текущую форму, чтобы вызвать экземпляр SetTextCallback делегата, передавая переменную text в качестве параметра. Экземпляр делегата указывает на метод SetText(), который из-за вызова this.Invoke() будет выполнен в том же потоке, что и форма.

Invocation используется для перемещения выполнения кода из фонового потока в поток формы/управления, что делает выполнение поточно-безопасным.

Эта часть просто для проверки, если вы должны вызвать:

if (this.f1_rtb_01.InvokeRequired) 

Если не требуется для вызова, что означает, что код уже работает на форме-й или нить элемента управления, и будет бросаться исключение, если вы пытаетесь вызвать.

1

Каждая форма работает в другом потоке. Позволяет называть их thread1 и thread2. Так как вы хотите что-то обновить в thread2 из thread1, вам нужно, чтобы эти два потока связывались друг с другом. И это invoke job

Условие состоит в том, чтобы проверить, требуется ли вызов. Если вы обновляете строку в thread1 в самом потоке1, тогда не требуется никакого вызова в противном случае.

 Смежные вопросы

  • Нет связанных вопросов^_^