2014-11-13 45 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

如果你絕對必須旋轉起來另一個線程,可以閱讀在現有的串行數據,並在將它作爲一個參數。否則,你只是爲自己和任何未來的項目維護者製造巨大的混亂。