使用Invoke\BeginInvoke对Windows窗体控件进行线程安全调用

当开启一个工作者线程或者使用TcpClient.BeginConnect异步调用,并在开启的线程中访问windows窗体控件时,会发生异常。异常消息:不是创建该控件的线程来访问".
意思就是说:设置UI控件属性时,不能由创建这个UI控件的线程外的其他线程来设置控件的属性。如下代码,在vc2005,vs2008中会出现异常:

View Code
 1 private void button_Click(object sender, EventArgs e)
 2 {
 3      Thread thread = new Thread(new ThreadStart(DoWork));
 4      thread.Start();
 5 }
 6 
 7 private void DoWork()
 8 {
 9      //访问来自thread线程,而不是创建textBox1的UI线程,所以运行到这里时,会弹出异常信息
10      this.textBox1.Text = "sdas";
11 }

 

通过Invoke\BeginInvoke来处理可以避免这样的异常,代码如下:

View Code
 1 public delegate void MyInvoke(string str1, string str2);//定义BeginInvoke的委托
 2 
 3 public Form1()
 4 {
 5        InitializeComponent();
 6 }
 7 
 8 private void button1_Click(object sender, EventArgs e)
 9 {
10        Thread thread = new Thread(new ThreadStart(DoWork));
11        thread.Start();
12 }
13 
14 private void DoWork()
15 {
16         MyInvoke mi = new MyInvoke(UpdateForm);
17         this.BeginInvoke(mi, new Object[] { "i am a textbox", " haha" });
18 }
19 
20 private void UpdateForm(string para1, string para2)
21 {
22         this.textBox1.Text = para1 + para2;
23 }

posted on 2012-06-11 11:07  ActiveChange  阅读(477)  评论(0编辑  收藏  举报

导航