本文转自: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. BAT:文件中替换字符(保留空格和换行)

    @echo off rem CMD:"color --help" :: setting color:back white,content blue color f9 ::old s ...

  2. linux_批量关闭进程

    以下环境是 fedora24 linux 系统中的情况: 仿真中遇到意外弹出上百个图片,无法一下全部关闭. 可以使用: ps -ef|grep LOCAL=NO|grep -v grep|cut -c ...

  3. Vue.js——快速入门

    Vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的.相比于Angular.js,Vue.js提供了更加简洁.更易于理解的API,使得我们能够快速地上手并使 ...

  4. 1.Spring AOP应用

    首先咱们来了解一下具体的业务场景(这是个真实的项目的业务场景):具体的业务是这样的,现在系统中有六十多个主档(功能模块),每个主档都有新增.修改.删除功能,当我们在对每个主档做这些操作时需要对其记录日 ...

  5. IntelliJ IDEA 和谐地址及快捷键

    转载:http://my.oschina.NET/dyyweb/blog/494504 http://blog.csdn.net/tanlon_0308/article/details/5085473 ...

  6. hive 数值计算函数

    Hive数值计算函数 (1)round(45.666,2)作用:四舍五入,保留2位小数 ceil(45.6) 作用:向上取整         floor(45.6) 作用:向下取整 (2)rand() ...

  7. day16_雷神_前端04

    前端day04 链接前端的一些库,一些资源,从bootcdn上搜,有前端所有的库. 前端工作流程: jquery的DOM文档操作 <!DOCTYPE html> <html lang ...

  8. 基于Fusioncharts的报表统计

    先了解fusioncharts插件,fusioncharts是一款基于XML和flash的报表组件,支持Java.PHP.AngularJS等等开发语言,所以,开发出来,加入swf文件,就可以出现动态 ...

  9. js连等赋值的陷阱

    先来看一段代码: (function(){ var x = y = 1; })(); console.log(y); console.log(x); 最开始我觉得这道题简直是送分题啊,很明显结果为,y ...

  10. soul开源网关项目搭建学习

    1. soul开源网关项目搭建学习 1.1. 地址 https://gitee.com/shuaiqiyu/soul 1.2. 介绍 官方介绍:这是一个异步的,高性能的,跨语言的,响应式的API网关. ...