Ho un equipaggiamento industriale controllato da un software. Il software si connette ad esso tramite prese, e mantiene la connessione sempre attiva, mentre di volta in volta invia comandi all'apparecchiatura. Ora, questa apparecchiatura è rappresentata da una classe che incapsula l'invio e la ricezione di dati.
Successivamente, ho bisogno di creare un'interfaccia utente che mostri lo stato dell'apparecchiatura, indipendente dal software di controllo (il controllo è su una stessa soluzione thread diversa). L'aggiornamento all'interfaccia utente deve essere fatto diciamo ogni secondo, ma può succedere che l'interfaccia utente desideri leggere i dati e il software di controllo desidera scrivere.
Il problema è che l'apparecchiatura potrebbe rispondere da 50 ms a 1 secondo, non lo sappiamo, e durante la risposta nessuno deve interferire!
Come posso sincronizzare al meglio le chiamate con la classe di comunicazione dell'apparecchiatura?
Potrebbero esserci almeno 2 soluzioni:
- Uso della semplice istruzione
lock(obj) {}
in C #, per ogni metodo nel comune. Classe - Uso di eventi e una coda di messaggi con un concetto di sottoscrittore
Mentre il primo potrebbe essere semplice, suppongo che il mio caso sia la soluzione peggiore perché può bloccare tutto.
Il secondo sembra più OK, ma il problema è che ci sarà sicuramente un ritardo nel ricevere i risultati se molti abbonati sono, o non lo so, non ne sono proprio sicuro.
UPDATE: Ho implementato usando il blocco semplice. Il motivo è che alcune apparecchiature non hanno (alcune lo fanno, ma la maggior parte no), dal lato del controller, la possibilità di elaborare più richieste e il loro buffer traboccherà. Quindi, per essere sicuro che non accada nulla di brutto, l'esclusivo blocco READ / WRITE è la soluzione migliore che ho trovato finora e funziona.