Нужно ли синхронизировать записи и чтения .NET SerialPort?
В моем приложении я использую класс .NET SerialPort для чтения и записи данных. Чтение выполняется с использованием события DataReceived, я предполагаю, что внутри него существует поток ThreadPool. Запись выполняется потоком пользовательского интерфейса (WinForms).
Мне было интересно, нужно ли синхронизировать доступ к экземпляру SerialPort, чтобы в одно и то же время не происходило никаких Reads/Writes. Моя совесть говорит мне, что я должен помещать блокировки вокруг этих вызовов, но я озадачен тем, что все примеры С# SerialPort, которые я нахожу в Интернете, вообще не используют блокировку.
Ответы
Ответ 1
Вот отличный поток по этой теме, с участием учащегося класса SerialPort:
MSDN: Как SerialPort обрабатывает DataReceived?
По моему опыту, я написал дюжину приложений для последовательной связи для использования в качестве аппаратных симуляторов, я не блокирую. В то время я не знал, был ли я в безопасности или нет, но на практике у меня еще не была ошибка. (год почти постоянного использования 20 + тестерами и автоматическими тестовыми машинами). Тем не менее, мои приложения не покидают компанию, если я пишу приложения для общественного потребления, я могу проявлять большую осторожность.
Ответ 2
Из документации:
Все публичные статические (Shared in Visual Basic) члены этого типа (SerialPort) являются потокобезопасными. Любые члены экземпляра не гарантируют безопасность потоков.
Итак, вы должны определенно синхронизировать чтение/запись с помощью блокировок.