Нужно ли синхронизировать .NET SerialPort для записи / чтения? - PullRequest
18 голосов
/ 10 декабря 2010

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

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

Ответы [ 2 ]

9 голосов
/ 10 декабря 2010

Вот отличная тема по теме, в которой участвует автор класса SerialPort:

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

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

4 голосов
/ 10 декабря 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...