smhy8187

 

C#中在线程中访问主Form控件的问题

http://blog.csdn.net/blog51/article/details/1739553

 

 

C#中在线程中访问主Form控件的问题

分类: 程序设计 965人阅读 评论(0) 收藏 举报

 C#不允许直接从线程中访问Form里的控件,比如希望在线程里修改Form里的一个TextBox的内容等等,唯一的做法是使用Invoke方法,下面是一个MSDN里的Example,很说明问题:

 

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;

   
public class MyFormControl : Form
   
{
      
public delegate void AddListItem(String myString);
      
public AddListItem myDelegate;
      
private Button myButton;
      
private Thread myThread;
      
private ListBox myListBox;
      
public MyFormControl()
      
{
         myButton 
= new Button();
         myListBox 
= new ListBox();
         myButton.Location 
= new Point(72160);
         myButton.Size 
= new Size(15232);
         myButton.TabIndex 
= 1;
         myButton.Text 
= "Add items in list box";
         myButton.Click 
+= new EventHandler(Button_Click);
         myListBox.Location 
= new Point(4832);
         myListBox.Name 
= "myListBox";
         myListBox.Size 
= new Size(20095);
         myListBox.TabIndex 
= 2;
         ClientSize 
= new Size(292273);
         Controls.AddRange(
new Control[] {myListBox,myButton});
         Text 
= " 'Control_Invoke' example ";
         myDelegate 
= new AddListItem(AddListItemMethod);
      }

      
static void Main()
      
{
         MyFormControl myForm 
= new MyFormControl();
         myForm.ShowDialog();
      }

      
public void AddListItemMethod(String myString)
      
{
            myListBox.Items.Add(myString);
      }

      
private void Button_Click(object sender, EventArgs e)
      
{
         myThread 
= new Thread(new ThreadStart(ThreadFunction));
         myThread.Start();
      }

      
private void ThreadFunction()
      
{
         MyThreadClass myThreadClassObject  
= new MyThreadClass(this);
         myThreadClassObject.Run();
      }

   }

   
public class MyThreadClass
   
{
      MyFormControl myFormControl1;
      
public MyThreadClass(MyFormControl myForm)
      
{
         myFormControl1 
= myForm;
      }

      String myString;

      
public void Run()
      
{


         
for (int i = 1; i <= 5; i++)
         
{
            myString 
= "Step number " + i.ToString() + " executed";
            Thread.Sleep(
400);
            
// Execute the specified delegate on the thread that owns
            
// 'myFormControl1' control's underlying window handle with
            
// the specified list of arguments.
            myFormControl1.Invoke(myFormControl1.myDelegate,
                                   
new Object[] {myString});
         }

      }

   }


 

posted on 2012-02-03 14:20  new2008  阅读(725)  评论(0编辑  收藏  举报

导航