2011-08-20 79 views
1

我正在使用.NET 4串行端口類和DataReceived處理程序。NET串行端口DataReceived(開/關)

在DataReceive處理程序中,我從串行端口中刪除處理程序,處理數據,並在函數的末尾重新添加處理程序。

try 
{ 
    serial_port.datareceived -= new serialdatareceivedeventhandler(ondatareceived); 

    // readline and process data 
} 
catch (exception ex) 
{ 
} 
finally 
{ 
    serial_port.datareceived += new serialdatareceivedeventhandler(ondatareceived); 
} 

這種用法的後果是什麼?它似乎工作得很好,雖然我沒有長期測試它。我應該研究一種不同的方法嗎?如果可能,請給出一個簡單的代碼示例/大綱。謝謝。

+0

你爲什麼這樣做?避免再入?順便說一句:你冒這樣的方式丟失一些數據... – Yahia

+0

讓我想知道是否實際上可以重新進入或框架 – Eddy

+0

@yahia - 是的,以避免在處理收到的數據時重新進入。由於設備是手動激活的,數據丟失不成問題,因此我從不丟失數據。 – BoxerJoe

回答

0

我個人不會刪除每個DataReceived事件的處理程序,這是不必要的。如果您沒有收到傳入數據的通知,則總是有可能超出現有緩衝區並丟失信息。

我會使用類似Microsoft Example東西:

從上面的MSDN文章:

private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) 
{ 
    SerialPort sp = (SerialPort)sender; 
    string indata = sp.ReadExisting(); 
    Console.WriteLine("Data Received:"); 
    Console.Write(indata); 
    } 
+0

我正在做處理程序內的數據庫插入,並不確定如果事件是可重入的,我正在處理的設備也是手動激活,因此我從不丟失數據。我只是不知道是否有這樣的做法。 – BoxerJoe

+0

當您附加和分離事件處理程序時,發生開銷。如果你不希望它是可重入的,我可能會將所有重要的事情從事件處理程序中解放出來,並將傳入的數據放入隊列中,並讓數據庫例程監視隊列中的數據。 –

+0

這是一個好主意。我確實需要立即向用戶提供有關在數據庫中記錄事件的成功實時反饋。一個用戶每15秒只能激活一次該設備,但另一個用戶可以在前一個用戶之後立即前來激活該設備。 (順便說一下,看起來你正在研究一些有趣的東西......是那些混凝土攪拌系統嗎?) – BoxerJoe

-2

對此代碼:

catch (exception ex) 
{ 
} 

永遠,永遠,永遠,永遠,永遠,永遠永遠永遠永遠不會寫這樣的代碼。

這就像在您的兒童牀房間移除煙霧探測器。

+1

這顯然不是實際的代碼......你的回答屬於評論(或者更好地保留給自己,因爲它非常粗魯)。 – BoxerJoe

+2

如果它不是實際的代碼,爲什麼它在那裏?我相信我的帖子非常有幫助。 –

+0

這是什麼答案? –

0

如果你擔心重入,使用lock或互斥:

lock(lockobj) 
{ 
    /*Read data from the port here.*/ 
} 

從事件退訂不成功,防止重入,因爲,由於搶佔式調度(而不是合作的多線程或類似的東西),你的代碼在進入方法之後(甚至在此之前)可能被搶佔,然後你有機會取消訂閱,並且有更多的數據到達,再次觸發機制。

實際上,文件明確指出,

Only one event handler can execute at a time.