博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用Invoke解决多线程间的控件访问出错
阅读量:6330 次
发布时间:2019-06-22

本文共 1355 字,大约阅读时间需要 4 分钟。

使用Invoke解决多线程间的控件访问出错

转自

在一个WinForm界面上有一个按钮(button1)和一个文本框(textBox1),在button1的点击事件处理程序中创建一个新的线程,并期望在新线程中更改textBox1的值,容易出错的代码如下

//
 按钮点击事件处理程序
private
 
void
 button1_Click(
object
 sender, EventArgs e)
{
    
//
创建新线程
    Thread processorThread 
=
 
null
;
    processorThread 
=
 
new
 Thread(
new
 ThreadStart(Done));
    processorThread.IsBackground 
=
 
true
;
    processorThread.SetApartmentState(ApartmentState.STA);
    processorThread.Start();
}
//
 更新textBox1值
private
 
void
 Done()
{
    textBox1.Text 
=
 
"
www.mzwu.com
"
;
}
 

运行程序点击按钮后出错,提示:线程间操作无效: 从不是创建控件“textBox1”的线程访问它。下边我们用Invoke解决这一问题:

//
 按钮点击事件处理程序
private
 
void
 button1_Click(
object
 sender, EventArgs e)
{
    
//
创建新线程
    Thread processorThread 
=
 
null
;
    processorThread 
=
 
new
 Thread(
new
 ThreadStart(Done));
    processorThread.IsBackground 
=
 
true
;
    processorThread.SetApartmentState(ApartmentState.STA);
    processorThread.Start();
}
//
 定义委托
delegate
 
void
 WriteInvoke(
string
 msg);
private
 
void
 Write(
string
 msg)
{
    textBox1.Text 
=
 msg;
}
//
 更新textBox1值
private
 
void
 Done()
{
    
this
.Invoke(
new
 WriteInvoke(Write), 
new
 
object
[] { 
"
www.mzwu.com
"
 });
}

 

更新成功!

总结一下:在当前线程中不允许直接调用在其他线程实例化的对象,因为这种操作是线程不安全的,编译器是禁止的。但我们常常希望达到这样的目的,比如创建一个辅助线程,在辅助线程中创建WebClient对象,用来发送信息,然后把接收到的信息反馈到主线程的某个对象。这时我们就可以使用委托的方法来达到,主要步骤是把原先非法调用对象的语句单独写成更新函数,定义一个函数委托类并串接更新函数进行实例化,最后在需要更新的地方调用Invoke方法即可达到目的。

转载于:https://www.cnblogs.com/mashang/archive/2009/08/01/1536706.html

你可能感兴趣的文章
详解Oracle临时表的几种用法及意义
查看>>
HTML(七)------ 表格
查看>>
如何成为一个设计师和程序员混合型人才
查看>>
unable to load selinux policy. machine is in enforcing
查看>>
2015年10月23日作业
查看>>
MySQL5.7 加强了root用户登录安全性
查看>>
CentOS 6.3_Nagios安装配置与登录
查看>>
加强型的记录集权限(数据集权限、约束表达式设置功能)实现方法界面参考...
查看>>
Linux 内存机制
查看>>
linux下定时任务
查看>>
SharePoint 2013 部署 Part 1
查看>>
DWGSee看图纸dwg文件阅读器免费下载地址
查看>>
高能天气——团队Scrum冲刺阶段-Day 1-领航
查看>>
ISI CVPR journal ranking
查看>>
free movie
查看>>
列表组
查看>>
CF 988E Divisibility by 25 思维 第十二
查看>>
Linux Shell多命令执行
查看>>
Java中的异常处理:何时抛出异常,何时捕获异常,何时处理异常?
查看>>
css3中的变形(transform)、过渡(transtion)、动画(animation)
查看>>