在我的應用程序中,我使用.NET SerialPort類來讀取和寫入數據。讀取是使用DataReceived事件完成的,我假設它是在ThreadPool線程內部進行的。寫作由UI線程(WinForms)完成。是否需要同步.NET SerialPort寫入/讀取?
我想知道,如果有必要同步對SerialPort實例的訪問,以避免同時發生讀/寫操作。我的良知告訴我應該對這些調用進行鎖定,但是我感到困惑,因爲我在Internet上找到的所有C#SerialPort示例都根本不使用鎖定。
在我的應用程序中,我使用.NET SerialPort類來讀取和寫入數據。讀取是使用DataReceived事件完成的,我假設它是在ThreadPool線程內部進行的。寫作由UI線程(WinForms)完成。是否需要同步.NET SerialPort寫入/讀取?
我想知道,如果有必要同步對SerialPort實例的訪問,以避免同時發生讀/寫操作。我的良知告訴我應該對這些調用進行鎖定,但是我感到困惑,因爲我在Internet上找到的所有C#SerialPort示例都根本不使用鎖定。
這裏有一篇很棒的線程,與SerialPort類的參與作者:
MSDN: How does SerialPort handle DataReceived?
從我的經驗,我已經寫了十幾個串行通信的應用程序使用硬件仿真器,我不要鎖定。當時我不知道自己是否安全,但在實踐中,我還沒有犯錯。 (20年以上的測試人員和自動測試機器幾乎不間斷地使用一年)。也就是說,如果我正在編寫公共應用程序,我的應用程序不會離開公司,我可能會更加小心。
感謝您提供優秀的信息鏈接 - 這是一個不錯的發現。但我認爲在做出像原始問題一樣的設計決策時,不要過於依賴這些實施細節。確切地知道事情如何在引擎蓋下工作很有趣也很好,但由於它沒有正式記錄,所以不能保證它會保持這種狀態。文檔(和最佳實踐)建議您鎖定,所以這就是我要做的,除非這樣做有一個特殊的*缺點*。 – 2010-12-10 16:48:35
哇,那個鏈接肯定會回答一些問題!我將使用鎖,因爲我還必須處理這樣的場景,例如使用我的類中的相同成員引用關閉和重新連接串口,所以這些事情也必須同步 – Mike 2010-12-10 16:53:43
從文檔:
任何公共靜態這種類型(的SerialPort)的成員(在Visual Basic中的Shared)都是線程安全的。任何實例成員不保證是線程安全的。
所以你應該定義你的讀/寫與鎖同步。
是的,我知道措辭,這就是爲什麼我要首先同步這些電話。 – Mike 2010-12-10 15:41:48
你一定要鎖定。你在互聯網上找到的例子很可能過於簡單了。我試圖使它成爲一個規則,仔細閱讀我正在嘗試遵循的任何示例的文檔,以防萬一這樣的事情被省略。 – 2010-12-10 15:42:47