C#跨线程调用控件
2018-06-23 23:59:49来源:未知 阅读 ()
C#跨线程调用控件
在C#应用程序开发中,我们经常需要把UI线程和工作线程分开编程,为了防止界面停止响应。同时,我们也需要在工作线程中去更新UI界面的控件,在CLR的线程安全中并不允许我们直接在工作线程操作UI界面。因此,介绍以下三种方式进行跨线程操作UI。
第一种方法:使用delegate和invoke来从其他线程中调用控件
private void button2_Click(object sender, EventArgs e) { Thread thread1 = new Thread(new ParameterizedThreadStart(UpdateLabel2)); thread1.Start("更新Label"); } private void UpdateLabel2(object str) { // 当一个控件的InvokeRequired属性值为真时,说明有一个创建它以外的线程想访问它 if (label2.InvokeRequired) { //lamda表达式的action委托,<string>为参数类型,(x)为形参 Action<string> actionDelegate = (x) => { this.label2.Text = x.ToString(); }; // 或者 // Action<string> actionDelegate = delegate(string txt) { this.label2.Text = txt; }; //同步激活委托action this.label2.Invoke(actionDelegate, str); } else { this.label2.Text = str.ToString(); } }
第二种方法:使用delegate和BeginInvoke来从其他线程中控制控件
该方法与上述方法的唯一差别在于,其中的Invoke激活函数换成了BeginInvoke激活函数。
两个函数的本质区别在于,Invoke方法是线程同步,当工作线程执行完毕后,才会再次触发;
而BeginInvoke方法是线程异步,当工作线程还未执行完,它便会开启另一个线程去完成工作线程。
第三种方法:使用BackgroundWorker组件(推荐使用这个方法)
BackgroundWorker是.NET的执行多线程任务控件,它允许在单独的一个工作线程中执行一些复杂的操作(耗时操作),做完后回到原有线程(主线程),去操作UI线程界面控件。类似于线程同步上下文。在DoWork事件中,执行耗时操作;在RunWorkerCompleted事件中操作UI界面。
private void button4_Click(object sender, EventArgs e) { using (BackgroundWorker bw = new BackgroundWorker()) { bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted); bw.DoWork += new DoWorkEventHandler(bw_DoWork); bw.RunWorkerAsync("Tank"); } } //做耗时工作线程 void bw_DoWork(object sender, DoWorkEventArgs e) { // 这里是后台线程, 是在另一个线程上完成的 // 这里是真正做事的工作线程 // 可以在这里做一些费时的,复杂的操作 Thread.Sleep(5000); e.Result = e.Argument + "工作线程完成"; } //回到UI主线程 void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { //这时后台线程已经完成,并返回了主线程,所以可以直接使用UI控件了 this.label4.Text = e.Result.ToString(); }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:语文,数据库管理
- html表单控件禁用属性:readonly VS disabled【转】 2020-04-13
- 使用lodop.js打印控件打印table并分页等 2019-10-16
- 当地天气调用 2019-01-21
- 微信小程序调用地图选取位置后返回信息 2019-01-10
- C# 的界面控件属性修改线程安全问题 2018-06-27
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash