串行端口数据接收事件处理程序

本文关键字:事件处理 程序 数据 串行端口 | 更新日期: 2023-09-27 18:30:23

我正在从C#中的串行端口读取数据,如下所示:

mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

如果函数 DataReceivedHandler 是计算密集型的,有没有办法确保在收到下一个数据时它不会等待前一个函数完成,而是使用新数据启动 DataReceivedHandler 的另一个实例?

串行端口数据接收事件处理程序

嗯,我不认为 Gh0st22 的答案同时是合理的。首先,DataReceivedHandler 已经从串行端口类内部的线程池中调用。其次,我没有看到任何实现或提及锁定。串行缓冲区将是一场噩梦,所以让我们退后一步。

真的在观察你害怕会发生的问题吗?看到我多次引用的这个伟大的回应:

https://social.msdn.microsoft.com/Forums/vstudio/en-US/e36193cd-a708-42b3-86b7-adff82b19e5e/how-does-serialport-handle-datareceived?forum=netfxbcl#298028ff-2b76-4685-947c-f68291882b09

如果绝对必须启动另一个线程,请考虑读取可用的串行数据并将其作为参数传入。否则,你只会给自己和项目的任何未来维护者制造一个巨大的混乱。

您可以使用

线程(添加using System.Threading;)来实现此目的

public static void main(string[] args)
{
    SerialPort mySerialPort = new SerialPort();
    mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
}
public static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
    Thread thread = new Thread(thisClass.Worker);
    thread.Start(sender, e);
}
public static void Worker(object sender, object ev)
{
    SerialDataReceivedEventArgs e = (SerialDataReceivedEventArgs) ev;
    // Put your code here
}

优点

  • 在完成工作时调用此方法时,将允许它完成

缺点

  • 程序将继续运行,即使在关闭后,直到所有线程完成