本文转自:https://blog.csdn.net/hjk216/article/details/72677596

转载地址:http://www.ciast.net/post/20160752.html

  1.  
    private void DisplayText(object sender, EventArgs e)
  2.  
    {
  3.  
    textBox1.Text = datain;
  4.  
    }
  5.  
     
  6.  
    private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) //本方法注册到了串口接收数据事件上去
  7.  
    {
  8.  
    datain = serialPort1.ReadExisting();
  9.  
    this.Invoke(new EventHandler(DisplayText)); //括号内为绘制窗口的方法的委托,采用的是标准事件的委托
  10.  
    }

如上程序所示,在串口接收数据的方法中我们使用了this.Invoke(),下面讲一下关于this.Invoke()在串口中的使用,自己也是菜鸟,所以仅供参考。

首先我们要知道:串口接收事件会自动创建线程(也就是说它已经不在主线程了),对于C#来说,默认是不能在其它线程中对非本线程创建的控件进行访问的(一般情况下控件都是主线程中的),如果你的这个事件代码中不操作控件(比如文本框之类的),那可以不用invoke,否则就要用委托了,不然在运行中就会报错。

也就是说在串口接收数据中,我们使用了多线程,我们现在需要用工作线程获得的串口数据去修改界面中LABEL1的text属性,而界面的创建和修改都是主线程的事,但是在多线程编程中,我们经常要在工作线程中去更新界面显示,而在多线程中直接调用界面控件的方法是错误的做法(不能跨线程直接访问),Invoke 和 BeginInvoke 就是为了解决这个问题而出现的,使你在多线程中安全的更新界面显示。

那么Invoke或者BeginInvoke是怎么解决这件事情的呢?首先我们以Invoke 为例(BeginInvoke 类似)。我们通常的做法是将工作线程中设计界面更新的代码封装成一个方法,使用Invoke去调用,这里要让封装的方法尽量的简单,因为折让可以使 UI 线程(主线程)的负担不至于太大而已,因为界面的正确更新始终要通过 UI 线程去做,我们要做的事情是在工作线程中包揽大部分的运算,而将对纯粹的界面更新放到 UI 线程中去做,这样也就达到了减轻 UI 线程负担的目的了。让后我们的Invoke 就该上场了,Invoke方法一般应用在辅助线程中修改UI线程( 主线程 )中对象的属性时,主要是像上面一样调用this.Invoke();这里的this是什么意思呢?

这里让我们看一看Invoke()在系统中的定义:

C
  1.  
    // 摘要:
  2.  
    // 在拥有此控件的基础窗口句柄的线程上执行指定的委托。
  3.  
    // 参数:
  4.  
    // method:
  5.  
    // 包含要在控件的线程上下文中调用的方法的委托。
  6.  
    //
  7.  
    // 返回结果:
  8.  
    // 正在被调用的委托的返回值,或者如果委托没有返回值,则为 null。
  9.  
    [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
  10.  
    public object Invoke(Delegate method);

由定义可知“在拥有此控件的基础窗口句柄的线程上执行指定的委托。”所以我们知道这里的this是指的主窗口,而这里的Invoke()在主窗口中执行。我们有如下一般结论:Invoke()的作用是在应用程序的主线程上执行指定的委托。就是说使用Invoke ()之后,虽然这句函数是在串口数据接收的子线程中调用的,但是系统会在主线程上调用Invoke 中制定的委托事件,而且子线程的参数也会被传递到委托方法中去,这样看起来做到了在子线程中执行界面显示任务,而且显示的参数也是子线程的。

C# this.Invoke()的作用与用法

C#中Invoke的用法

[转]C# serialPort 串口接收中this.Invoke的使用的更多相关文章

  1. System.IO.Ports.SerialPort串口通信接收完整数据

    C#中使用System.IO.Ports.SerialPort进行串口通信网上资料也很多,但都没有提及一些细节: 比如 串口有时候并不会一次性把你想要的数据全部传输给你,可能会分为1次,2次,3次分别 ...

  2. 关于STM32串口接收中断中只能接收一个字节

    最近调试STM32的串口接收时发现例程中只能接收一个字节 例程如下: //初始化串口1 void uart_init(u32 bound){ //GPIO端口设置 GPIO_InitTypeDef G ...

  3. winform SerialPort串口通信问题

    一.串口通信简介串行接口(串口)是一种可以将接受来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接受的串行数据流转换为并行的数据字符供给CPU的器件.一般完成这种功能的电路,我们称为串 ...

  4. STM32串口接收不定长数据原理与源程序(转)

    今天说一下STM32单片机的接收不定长度字节数据的方法.由于STM32单片机带IDLE中断,所以利用这个中断,可以接收不定长字节的数据,由于STM32属于ARM单片机,所以这篇文章的方法也适合其他的A ...

  5. stm32的串口接收字符串以十六进制数

      #include "pbdata.h"   uint8_t TxBuffer1[] = "USART Interrupt Example: This isUSART1 ...

  6. STM32 ucosii 串口接收数据 遇到的问题及解决思路

    写一个程序,用到了ucos ii ,串口在中断中接收数据(一包数据 8个字节 包含: 1byte包头 5byte数据 1byte校验和 1byte 包尾 ) ,数据由上位机每隔500ms发送一次,在串 ...

  7. (c#2.0)serialPort串口通讯

    原文:(c#2.0)serialPort串口通讯 using System; using System.Collections.Generic; using System.ComponentModel ...

  8. 串口通信中ReadFile和WriteFile的超时详解!

    源:串口通信中ReadFile和WriteFile的超时详解! 在用ReadFile和WriteFile读写串行口时,需要考虑超时问题.如果在指定的时间内没有读出或写入指定数量的字符,那么ReadFi ...

  9. 2018最新mfc作为上位机接收硬件端USB或串口数据显示成图片 解决串口接收数据丢字节丢包问题

    原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/9490616.html 本文用的是VS2013MFC写串口数据接收: 第一步:首先建立一个MFC ...

随机推荐

  1. 用不到 50 行的 Python 代码构建最小的区块链

    引用 译者注:随着比特币的不断发展,它的底层技术区块链也逐步走进公众视野,引起大众注意.本文用不到50行的Python代码构建最小的数据区块链,简单介绍了区块链去中心化的结构与其实现原理. 尽管一些人 ...

  2. 【adb】执行adb devices 设备offline

    解决办法: 1.执行adb kill-server,在执行adb devices 2.重启手机 ---------------------------------------------------- ...

  3. LeetCode刷题:第四题 寻找两个有序数组的中位数

    题目描述: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和  ...

  4. RabbitMQ Routing 消息路由

    上篇文章中,我们构建了一个简单的日志系统.接下来,我们将丰富它:能够使用不同的severity来监听不同等级的log.比如我们希望只有error的log才保存到磁盘上. 1. Bindings绑定 上 ...

  5. Calendar and GregorianCalendar

    1.GregorianCalendar是Calendar的一个具体子类,提供了世界上大多数国家/地区使用的标准日历系统 2.注意 (1)月份:1月到12月[0-11] (2)星期:周日到周六[1-7] ...

  6. Python学习笔记-基础1

    一 初识Python python是一种面向对象.解释型的计算机程序语言.Python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特 ...

  7. EBS API及接口清单

    https://www.cnblogs.com/lizicheng/p/9521742.html 模块 应用场景 类型 API/接口 AP 付款核销 API ap_pay_invoice_pkg.ap ...

  8. 记一个centos分区大小调整过程

    1. 备份 /home 目录 [root@centos ~]# cp -r /home /home_backup 2. 查看目前磁盘使用的情况, 需要将 /dev/mapper/centos-home ...

  9. TIME_WAIT状态过多的排查

    一.概述 (一)现象 服务器有两个现象,第一是tcp连接数不多,不超过10个,但是time_wait状态的2000.第二个按照以往的性质,在很少用户访问的情况下,服务器的资源几乎没有使用,比如CPU, ...

  10. HTTP 协议常见的状态码

    HTTP状态码负责表示客户端HTTP请求的返回结果.标记服务器端的处理是否正常.通知出现的错误等工作. 状态码的类别: 记录在RFC2616上的HTTP状态码有40种,再加上WebDAV等的扩展,数量 ...