zoukankan      html  css  js  c++  java
  • C# 中在Form控件创建以外的线程操作控件问题

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

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

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

    1. 查询控件的 InvokeRequired 属性。

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

    3. 如果 InvokeRequired 返回 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
                {

          //操作

                }

         }

       这样的目的就达到了。

  • 相关阅读:
    非循环单链表节点的操作
    链表每一个节点的数据类型该如何表示
    链表的定义、确定一个链表需要几个参数?
    typedef的用法
    连续存储数组的算法(包含数组倒置、冒泡排序……)
    跨函数使用内存案例
    malloc()动态分配内存概述
    结构体
    指针和数组
    C#基础知识之dnSpy反编译
  • 原文地址:https://www.cnblogs.com/amishe/p/3127173.html
Copyright © 2011-2022 走看看