子线程调用UI线程的方法

vs2005中,子线程不允许使用UI中的控件,网上的解决方法都有:使用控件的Invoke,不过在我自己的应用中总觉得麻烦:我要从子线程中调用一个主线程中的处理,要用一次委托,而Invoke还要用委托,绕来绕去,把人绕的很晕。我稍微改了一下结构,可以比较方便的达到在子线程中调用UI线程中的处理函数。

在线程类中,定义

public delegate void ReceivedHandlerUI(object obj);     //接收处理,涉及UI

使用两个变量,第二个只要是界面中的任意控件都行,主要是利用它回到UI线程

public ReceivedHandlerUI OnReceivedUI;  //接收处理函数,涉及UI
public System.Windows.Forms.Control UICtrol;  //界面中的任意控件

关联的方法

public void SetReceivedUserUI(ReceivedHandlerUI rh, System.Windows.Forms.Control ctl)
{
    OnReceivedUI = rh;
    UICtrol = ctl;
}  

子线程中需要调用UI中的处理:

if (OnReceivedUI != null && UICtrol != null)
{
    UICtrol.Invoke(OnReceivedUI, state);
}    

---------------------------------------------

UI中处理,往往会变化,但只要这么做

threadobj.SetReceivedUserUI(new ReceivedHandlerUI(MyReceivedHandlerUI), this);
//界面处理
void MyReceivedHandlerUI(object obj)
{
    LineInfo li = (LineInfo)obj;
    textBox2.Text +=  "收到数据:" + li.RetrieveFromBuffer()+"\r\n";
}  

我的程序中,子线程的处理相对稳定,主界面中的处理反而相对变化,这种处理方式,可以很快的写出需要的处理程序,可以使用任意控件。同时,由于是在UI线程中执行,所以操作控件时也不用考虑并发性线程安全之类的。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏mySoul

作为window对象属性的元素 多窗口和窗体

如果html文档中用id属性为元素命名。并且如果 window对象没有此名字的属性,则window对象会赋予一个属性,其名字为id属性的值,其值指向该元素

1415
来自专栏angularejs学习篇

angularjs学习第四天笔记(第一篇:简单的表单验证)

您好,我是一名后端开发工程师,由于工作需要,现在系统的从0开始学习前端js框架之angular,每天把学习的一些心得分享出来,如果有什么说的不对的地方,请多多指...

1081
来自专栏移动开发之家

Flutter完整开发实战详解(二、 快速开发实战篇)

 作为系列文章的第二篇,继《Flutter完整开发实战详解(一、Dart语言和Flutter基础)》之后,本篇将为你着重展示:如何搭建一个通用的Flutter ...

1.5K1
来自专栏逸鹏说道

Jupyter ~ 像写文章般的 Coding (附:同一个ipynb文件,执行多语言代码)

这次选Markdown模式(关于Markdown基础可以看之前写的Markdown Base)

1.9K6
来自专栏柠檬先生

zepto 基础知识(6)

101.$.ajax   $.ajax(options) 类型:XMLttpRequest   执行Ajax请求。他可能是本地资源,或者通过支持...

28210
来自专栏angularejs学习篇

angularjs学习第四天笔记(第一篇:简单的表单验证)

您好,我是一名后端开发工程师,由于工作需要,现在系统的从0开始学习前端js框架之angular,每天把学习的一些心得分享出来,如果有什么说的不对的地方,请多多指...

1132
来自专栏欧阳大哥的轮子

Windows窗口类

Windows编程中,对所有的GUI组件和控件进行了分类,每种类型的实例对象都具有不同的特性,这些特性包括UI外观以及事件的处理和响应的方法。就和面向对象技术中...

1092
来自专栏程序员的SOD蜜

不使用反射,“一行代码”实现Web、WinForm窗体表单数据的填充、收集、清除,和到数据库的CRUD

问题篇:     昨天在CSDN看到这样一个帖子:“苦逼的三层代码”: 采用传统的三层架构写代码,每个数据表都要定义一个实体对象,编写后台的时候, Web层需要...

3518
来自专栏Golang语言社区

Golang语言社区--golang 进度下载文件

大家好,我是Golang社区主编彬哥,本篇给大家转载一篇关于文件下载相关的文章。

4906
来自专栏逍遥剑客的游戏开发

Nebula3嵌入WPF

1512

扫码关注云+社区

领取腾讯云代金券