Подтвердить что ты не робот

Нужно ли синхронизировать записи и чтения .NET SerialPort?

В моем приложении я использую класс .NET SerialPort для чтения и записи данных. Чтение выполняется с использованием события DataReceived, я предполагаю, что внутри него существует поток ThreadPool. Запись выполняется потоком пользовательского интерфейса (WinForms).

Мне было интересно, нужно ли синхронизировать доступ к экземпляру SerialPort, чтобы в одно и то же время не происходило никаких Reads/Writes. Моя совесть говорит мне, что я должен помещать блокировки вокруг этих вызовов, но я озадачен тем, что все примеры С# SerialPort, которые я нахожу в Интернете, вообще не используют блокировку.

4b9b3361

Ответ 1

Вот отличный поток по этой теме, с участием учащегося класса SerialPort:

MSDN: Как SerialPort обрабатывает DataReceived?

По моему опыту, я написал дюжину приложений для последовательной связи для использования в качестве аппаратных симуляторов, я не блокирую. В то время я не знал, был ли я в безопасности или нет, но на практике у меня еще не была ошибка. (год почти постоянного использования 20 + тестерами и автоматическими тестовыми машинами). Тем не менее, мои приложения не покидают компанию, если я пишу приложения для общественного потребления, я могу проявлять большую осторожность.

Ответ 2

Из документации:

Все публичные статические (Shared in Visual Basic) члены этого типа (SerialPort) являются потокобезопасными. Любые члены экземпляра не гарантируют безопасность потоков.

Итак, вы должны определенно синхронизировать чтение/запись с помощью блокировок.