2010-12-10 10 views
16

W mojej aplikacji używam klasy .NET SerialPort do odczytu i zapisu danych. Odczyt jest dokonywany przy użyciu zdarzenia DataReceived, zakładam wewnętrznie w wątku ThreadPool. Pisanie odbywa się za pomocą wątku UI (WinForm).Czy konieczna jest synchronizacja .NET SerialPort zapisuje/czyta?

Zastanawiam się, czy konieczne jest zsynchronizowanie dostępu do instancji SerialPort, aby w tym samym czasie nie było możliwe odczytywanie/zapisywanie. Moje sumienie mówi mi, że powinienem blokować te połączenia, ale jestem zdziwiony, ponieważ wszystkie przykłady z C# SerialPort, które znalazłem w Internecie, w ogóle nie używają blokowania.

+2

Powinieneś zdecydowanie zablokować. Najprawdopodobniej przykłady znalezione w Internecie są zbyt uproszczone. Staram się uważnie przeczytać dokumentację dla każdego przykładu, który próbuję podążać, na wypadek gdyby coś takiego zostało pominięte. –

Odpowiedz

9

Oto wielki wątek na ten temat, z autorem klasy SerialPort uczestniczącego:

MSDN: How does SerialPort handle DataReceived?

Z mojego doświadczenia wynika, że ​​zostały napisane aplikacje komunikacji szeregowej kilkunastu do stosowania jako symulatorów sprzętowych, ja nie blokuj. Nie wiedziałem wtedy, czy jestem bezpieczny, czy nie, ale w praktyce nie popełniłem jeszcze błędu. (rok prawie stałego używania przez 20 + testerów i zautomatyzowane maszyny testujące). Powiedziałbym, że moje aplikacje nie opuszczają firmy, gdybym pisał aplikacje do publicznej konsumpcji, mógłbym bardziej uważać.

+1

Dzięki za doskonałe i informacyjne połączenie - to miłe znalezisko. Ale uważam, że należy zachować ostrożność, aby nie polegać zbytnio na tego rodzaju szczegółach implementacji podczas podejmowania decyzji projektowych, takich jak oryginalne pytanie. To interesujące i dobrze wiedzieć dokładnie, jak to działa pod maską, ale biorąc pod uwagę, że nie jest to oficjalnie udokumentowane, nie ma gwarancji, że tak pozostanie. Dokumentacja (i najlepsza praktyka) zaleca blokowanie, więc to właśnie bym zrobił, chyba że jest jakaś * wada *. –

+0

Wow, ten link z pewnością odpowiada na niektóre pytania! Pójdę z blokadami, ponieważ będę musiał obsługiwać takie scenariusze, jak zamykanie i ponowne podłączanie portu szeregowego przy użyciu tego samego odniesienia dla członków w mojej klasie, więc te rzeczy również będą musiały być zsynchronizowane – Mike

2

Z dokumentacji:

Wszystkie publiczne statyczny (Shared w języku Visual Basic) elementy członkowskie tego typu (SerialPort) są bezpieczne dla wątków. Dowolni członkowie instancji nie mogą zagwarantować bezpieczeństwa w wątku.

Powinieneś więc zsynchronizować odczyt/zapis z blokadami.

+1

Tak, znam to sformułowanie, dlatego chciałem zsynchronizować te połączenia w pierwszej kolejności. – Mike

Powiązane problemy