C#中多线程里面如何调用控件
来源:互联网 发布:电视直播软件电脑版 编辑:程序博客网 时间:2024/06/05 08:47
- 首先我们在C#中的Winform中经常会遇到多线程的情况,这个时候如果我要对界面进行同步更新,直接在多线程里面调用控件是会报如下的错误: InvaidOperationException,无效的操作异常。
- 我们从异常中可以读取到:线程间操作无效,从不是创建的控件的线程去访问它。
- 在clickBtn的点击事件里创建的线程,不能直接调用DoButton方法去操作clickBtn的文本
private void clickBtn_Click(object sender,EventArgs e){//在clickBtn的点击事件里面创建一个线程Thread thread = new Thread(new ThreadStart(DoButton));thread.Start();}public void DoButton(){ clickBtn.Text ="改变点击";}
4.对于涉及到线程的问题,我们如何去处理此类问题,通常有两种
方法来处理这样的问题:
①通过设置Control的属性;
②利用事件委托delegate来处理->1是通过常用方法,2是匿名方法;
Control属性的设置一般是在Form_Load()的方法中,设置
//设置为false,表示对错误的线程调用不进行报错Control.CheckForIllegalCrossThreadCalls = false;
Delegate事件委托进行处理:
普通方法:
//声明一个事件委托public delegate void SetButtonTextEvent(string strMsg);public void SetButtonText(string strMsg){ if( btnClick.InvokeRequired) { SetButtonTextEvent sBTEvent = new SetButtonTextEvent(SetButtonText); SetButtonText.Invoke(sBTEvent,new Object[]{strMsg}); } else { //这边一定要加要处理的控件属性 btnClick.Text =strMsg; }}//定义一个调用这个函数的线程方法public void DoSetText(){ SetButtonText("yyyy");}//在线程里面调用的时候Thread thread = new Thread(new ThreadStart(DoSetText));thread.Start();
匿名方法:
public void SetButtonText(string strMsg){ SetButtonTextEvent sBTEvent = delegate(string str ) { btnClick.Text = str; } btnClick.Invoke(sBTEvent,new object[]{strMsg});}
当然现在C#3.0以后可以Lambda表达式,所以我们可以更加简洁的方式写匿名委托;.NET Framework 3.5及其以后版本可以用Action封装方法:http://www.cnblogs.com/edisonchou/p/4104612.html
Lambda表达式: 这里写代码片()=>{} //语句Lambda
例如以下写法可以看上去非常简洁:
public void SetButtonText(string strMsg){ this.Invoke(new Action(()=> { btnClick.Text = strMsg; }));}
阅读全文
0 0
- C#中多线程里面如何调用控件
- C#多线程如何调用控件
- C#2005 多线程中调用窗体控件
- c# vs2005 多线程中调用窗体控件
- C# 多线程调用控件
- c#在多线程中如何调用Winform
- C# 在多线程中如何调用Winform
- c# vs2005 多线程中调用窗体控件 (摘)
- 如何在多线程中调用winform窗体控件
- 如何在多线程中调用winform窗体控件
- 如何在多线程中调用winform窗体控件
- 如何在多线程中调用winform窗体控件
- 如何在多线程中调用winform窗体控件
- 转:如何在多线程中调用winform窗体控件
- [C#学习]在多线程中如何调用Winform
- [C#学习]在多线程中如何调用Winform
- c#中如何跨线程调用windows控件
- 如何在WPF中调用C#控件库(HexEdit)
- windows下kafka服务搭建
- 强制类型转换static_cast、dynamic_cast、reinterpret_cast、和const_cast
- Redis集群_3.redis主从自动切换Sentinel
- Linux下非root用户如何安装软件
- 【java-分布式系统】消息中间件学习-jms(以ActiveMQ为例)
- C#中多线程里面如何调用控件
- 射线检测
- [web]ES6学习笔记(二)
- ORACLE 创建视图时,出现权限不足 ORA-01031:权限不足
- linux安装c++版本eclipse以及编译增加指定库
- JavaWeb
- 深入理解AudioService
- 168题引出的思考
- Mac 解压rar格式文件(附解压工具包)