2014-11-13 43 views
1

我从一个串口在C#中读取数据如下:串口数据接收的事件处理程序

mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

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

回答

1

您可以通过使用Threading实现这一目标(添加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 
} 

优势

  • 当在工作正在做的是调用此方法,将被允许完成

缺点

  • 程序将继续运行,即使其关闭,直到所有线程都完成
+0

根据其MSDN页面,DataReceived事件已从单独的线程中触发。启动另一个线程是不必要的,因为它已经*在另一个线程上。 –

2

嗯,我不认为从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

如果你绝对必须旋转起来另一个线程,可以阅读在现有的串行数据,并在将它作为一个参数。否则,你只是为自己和任何未来的项目维护者制造巨大的混乱。