博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 中在Form控件创建以外的线程操作控件问题
阅读量:5221 次
发布时间:2019-06-14

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

  最近在修改一个程序,程序由两个部分,UI界面和数据处理。数据处理来源外围的设备采集器,把采集的数据处理后显示在界面上。由于数据处理是后台线程负责的,这就遇到了跨线程操作控件的问题。

     参考MSDN上的解释,要根据控件的属性:

  对 Windows 窗体控件进行线程安全调用

  1. 查询控件的  属性。

  2. 如果  返回 true,则使用实际调用控件的委托来调用 

  3. 如果  返回 false,则直接调用控件。

      仿照MSDN修改,开始只是在线程中采用了Invoke的调用:

   DeepMsgHandle.Invoke(this, EventArg);//DeepMsgHandle是一个自定义的事件

     问题没有得到彻底解决。没有办法只能把关注点移到创建控件的部分,在创建线程前,先注册一个更新界面的事件,到后台线程需要跟新界面是触发这个事件。按照这个思路开始修改:

    1、在UI类中VocationalWork.DeepMsgHandle += AnalyzeReceData;注册一个接收事件给后台处理线程,用来更新界面。

    2、后台线程中触发事件:DeepMsgHandle.Invoke(this, EventArg);

    3、事件处理中判断是否需要Invoke,转换为线程安全调用:

   private void AnalyzeReceData(object sender, DalEventArgs eventArgs)

        {
            if (this.InvokeRequired)
            {
                this.Invoke(new DalUpdataMsgHandle(AnalyzeReceData), new object[] { sender, eventArgs });
            }
            else
            {

      //操作

            }

     }

   这样的目的就达到了。

 

转载于:https://www.cnblogs.com/amishe/archive/2013/06/08/3127173.html

你可能感兴趣的文章
HTML标签二
查看>>
caffe的在ubuntu下面的安装
查看>>
Python 3语法小记(九) 异常 Exception
查看>>
使用shared memory 计算矩阵乘法 (其实并没有加速多少)
查看>>
MySQL常用的函数
查看>>
Django 相关
查看>>
ArcGIS自定义工具箱-字段合并
查看>>
git init
查看>>
Vue(day8)
查看>>
sshpass ssh登录时自动输入密码
查看>>
训练记录
查看>>
【转】ubuntu16.04设置python3为默认及一些库的安装
查看>>
算数几何均值不等式,柯西不等式,琴生Jensen不等式
查看>>
mysql group by的用法 注意
查看>>
IList和DataSet性能差别 转自 http://blog.csdn.net/ilovemsdn/article/details/2954335
查看>>
Python中的join()函数的用法
查看>>
Hive教程(1)
查看>>
黑马程序员-指针的初步认识
查看>>
提示未授予用户在此计算机上的请求登录类型
查看>>
Java集合框架学习
查看>>