我从一个串口在C#中读取数据如下:串口数据接收的事件处理程序
mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
如果函数DataReceivedHandler是计算密集型的,是有办法,以确保下一个数据被接收到,它不会等待前一个函数完成,而是用新数据启动另一个DataReceivedHandler实例?
我从一个串口在C#中读取数据如下:串口数据接收的事件处理程序
mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
如果函数DataReceivedHandler是计算密集型的,是有办法,以确保下一个数据被接收到,它不会等待前一个函数完成,而是用新数据启动另一个DataReceivedHandler实例?
您可以通过使用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
}
优势:
个
- 当在工作正在做的是调用此方法,将被允许完成
缺点:
- 程序将继续运行,即使其关闭,直到所有线程都完成
嗯,我不认为从Gh0st22这个答案是同时发声。首先,DataReceivedHandler已经从串口类内部的线程池调用。其次,我看不到执行或提到的锁定。串行缓冲区将成为一个噩梦来处理,让我们退后一步。
您是否真的在观察您害怕会发生的问题?看到这个巨大的反响,我多次引用:
如果你绝对必须旋转起来另一个线程,可以阅读在现有的串行数据,并在将它作为一个参数。否则,你只是为自己和任何未来的项目维护者制造巨大的混乱。
根据其MSDN页面,DataReceived事件已从单独的线程中触发。启动另一个线程是不必要的,因为它已经*在另一个线程上。 –