C# 事件处理程序接收到的串行端口数据

C# 事件处理程序接收到的串行端口数据,c#,serial-port,C#,Serial Port,我从C#中的串行端口读取数据,如下所示: mySerialPort.DataReceived+=新的SerialDataReceivedHandler(DataReceivedHandler) 如果函数DataReceivedHandler是计算密集型的,是否有办法确保在收到下一个数据时,它不会等待上一个函数完成,而是用新数据启动DataReceivedHandler的另一个实例?您可以使用(添加使用System.Threading;)来实现这一点 优势: 当在工作完成时调用此方法时,将允许它

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

mySerialPort.DataReceived+=新的SerialDataReceivedHandler(DataReceivedHandler)


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

您可以使用(添加
使用System.Threading;
)来实现这一点

优势

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

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

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

你是否真的观察到了你担心会发生的问题?看到我多次提到的这一伟大回应:


<>如果你必须旋转另一个线程,考虑在可用的串行数据中读取并作为参数传递它。否则,您只会给您自己和项目的任何未来维护人员带来巨大的麻烦。

根据MSDN页面,DataReceived
事件已经从一个单独的线程触发。启动另一个线程是不必要的,因为它已经在另一个线程上。
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
}