使用Invoke\BeginInvoke对Windows窗体控件进行线程安全调用
当开启一个工作者线程或者使用TcpClient.BeginConnect异步调用,并在开启的线程中访问windows窗体控件时,会发生异常。异常消息:不是创建该控件的线程来访问".
意思就是说:设置UI控件属性时,不能由创建这个UI控件的线程外的其他线程来设置控件的属性。如下代码,在vc2005,vs2008中会出现异常:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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来处理可以避免这样的异常,代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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) 编辑 收藏 举报