Windows 事件与跨线程调用

需求

当我们新建一个类,通常会遇到当类的一个属性变化时,如何通知用户?比如串口收到数据,tcp 或UDP 收到网络数据时,如何及时通知用户?

1、查询是否收到,若收到,在文本框显示。

2、专门新增加一个线程,专门负责接收数据。当有数据收到时,通过"数据已收到"事件,用事件处理程序,来更新文本框。

第一种方法简单,但十分占用资源。第二种方法,涉及事件及线程安全问题。

现以第二种方法为例,进行说明。

(1) 在类中声明事件处理程序

java 复制代码
public   delegate void ReiceivedDataChgEventHandler(object sender, ReceivedDataChgEventArgs args); 
public    ReiceivedDataChgEventHandler?  ReceivedDataChg;

(2)在数据的set 方法中,加入事件处理

java 复制代码
public string ReceivedData{
  set
 	{
     string oldValue = receivedData??"";
     string newValue = value??"";
     receivedData = value;
     NewData = true;
     OnReceivedDataChg("receivedData", oldValue, newValue);
 		}
 }
 private string? receivedData;
 public virtual void OnReceivedDataChg(string name, object oldValue, object newValue)
 {
     if (ReceivedDataChg != null)
     {
         ReceivedDataChg.Invoke(this, new ReceivedDataChgEventArgs(name, oldValue, newValue));
     }
 }

3、在form中,新建类,并为ReceivedDataChg增加处理程序。特别要说明的时,由于类form并不时由serialPort类创建的,由类的实例调用form中的控件时,windows 认为类越权了。所以需要由textBox2反过来调用类的事件处理程序 "setText"。

是不是有点绕。

java 复制代码
private void button1_Click(object sender, EventArgs e)
{
    string portName = comboBox1.SelectedItem as string ?? "com1";
    sp = new(portName, 115200, 8, "1", SerialPortC.ParityBits.None);
    sp.ReceivedDataChg += SetText;
    if (sp._serialPort.IsOpen)
    {
        this.textBox1.Text = "AT";
        sp.Writeline("AT");
    }
}
public void SetText(object sender, ReceivedDataChgEventArgs args)
{
    if (this.textBox2.InvokeRequired)
    {
        this.textBox2.Invoke(SetText, this.textBox2, args);
    }
    else
    {
        this.textBox2.AppendText((string)args.NewValue);
    }
}
相关推荐
seahahacsdn14 分钟前
Windows系统添加VHD双系统
windows·vhd系统·vhd双系统
Hello_Pyhx5 小时前
iPhoneMirror:把 iPhone 接入 Windows,先分清投屏与反控
windows·ios·iphone
kakakahahahaha14 小时前
Win10开始菜单打不开排查:explorer、AppX注册、SFC、服务与用户配置修复
windows·电脑·笔记本电脑·内容运营·软件需求
ITHAOGE1514 小时前
下载 | Windows Server 2016最新纯净版ISO映像!(集成9月更新、标准版、数据中心版、14393.9514)
windows·科技·微软·电脑
传奇开心果编程20 小时前
【Compose Multiplatform 跨端开发学与练】第3课 布局与组件
android·windows·学习·ui·ios·kotlin·composer
懒人821 小时前
Windows11系统优化指南
windows·经验分享
Vex2une21 小时前
Windows 磁盘管理发展史:从 FDISK 分区表到存储池与虚拟磁盘
windows·gpt·磁盘管理·mbr·fdisk·动态磁盘·储存池
今夕资源网21 小时前
从夯到拉模拟器RankPix windows本地版 exe
windows·exe·从夯到拉·从夯到拉模拟器·rankpix·本地版
kakakahahahaha1 天前
Windows系统时间校准指南:time命令、date命令、w32tm /resync与CMOS排查
windows·笔记本电脑·软件需求
一技安身1 天前
【mysql】Windows MySQL 8.4.10 绿色免安装喂饭教程
windows·mysql·adb