2012-01-15 3 views
0

Можно создать дубликат:
How to update GUI from another thread in C#?C# - Заправка нити в формах

У меня есть форма с textBox1 и TextBox2. Мне нужен очень простой пример дополнительного потока для заполнения textBox2, чтобы понять принцип. До сих пор я использую MessageBox для отображения значения, но вместо этого хочу использовать textBox2. Вот мой код:

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

namespace Threads_example 
{ 
    public partial class Form1 : Form 
    { 
     Thread t = new Thread(t1); 
     internal static int x1 = 1; 


     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 

     } 


     static void t1() 
     { 
      do 
      { 
       x1++; 
       MessageBox.Show("x1 - " + x1.ToString()); 
      } 
      while(x1<10); 
     } 


     private void button1_Click(object sender, EventArgs e) 
     { 

      t.Start(); 

      for (int x = 1; x < 100000; x++) 
      { 
       textBox1.Text = x.ToString(); 
       textBox1.Refresh(); 
      } 
     } 

    } 
} 
+2

Нити не могут напрямую обращаться к компонентам пользовательского интерфейса. Вам нужно использовать 'Control.Invoke'. Поиск здесь или через Google должен показать много примеров. – ChrisF

ответ

0

Вы должны вызывать действия пользовательского интерфейса в GUI потоке. Это можно сделать примерно так:

private void RunFromAnotherThreadOrNot() 
{ 
      if (InvokeRequired) 
      { 
       Invoke(new ThreadStart(RunFromAnotherThread)); 
       return; 
      } 


      textBox2.Text = "What Ever"; 
      // Other UI actions 

}