我從一個串口在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事件已從單獨的線程中觸發。啓動另一個線程是不必要的,因爲它已經*在另一個線程上。 –