Domanda

La mia domanda riguarda il feedback sull'assicurarmi di adottare l'approccio giusto e gestire correttamente il threading. Ho la sensazione che potrei aver bisogno di impostare alcuni dei miei thread, quindi tutto il feedback è il benvenuto.

Il problema che ho è leggere tag RFID da zero o più lettori RFID. Posso leggere per un singolo lettore senza un problema, quindi leggere da diversi non sarà un problema. Ogni tag o batch di tag letti dal lettore viene consegnato da un evento .NET.

Il mio piano è di impostare una classe ReaderControl, che mantiene i lettori, la connessione, l'avvio, l'arresto, ecc. Questa classe ascolterà il Tagread Eventi dei lettori. Ad ogni evento gestisce (all'incirca ogni 250 ms) mette gli ID del tag di lettura (una stringa) in un hashset per mantenerli unici, l'hashset si trova in ReaderControl. Il ReaderControl conterrà un timer, che incendi/trascorre ogni 500 ms, questo evento timerere è gestito dal ReaderControl che impacchetterà i tag letti finora da tutti i lettori e aumenterà un Tagsread evento. Lo scopo è quello di ridurre al minimo gli eventi e ridurre i tag duplicati.

Il Tagsreads L'evento è gestito da un'altra classe chiamata TagTranslator. Questa classe si aggirerà tramite gli ID tag (stringhe) e scoprirà a cosa si riferisce il tag, cioè oggetto iperson. Questa classe farà un evento al completamento della traduzione con a Peopleseen evento.

Il Peopleseen L'evento è gestito da un modello in una GUI (modello MVP). L'idea generale è che un display GUI mostra nomi di persone che passano attraverso i lettori RFID. Il display è semplicemente ma ovviamente sotto i tag Hoods vengono letti in Asych ed è stato tradotto in oggetti "reali" da visualizzare.

Ritieni che ReaderControl dovrebbe essere in esecuzione sul proprio thread, penso che dovrebbe. Come faccio a confezionare questa classe nel suo thread solo per continuare a leggere tag indipendentemente da ciò che la GUI sta facendo. Inoltre, pensi che quando il tagtranslator durante la gestione degli eventi dovrebbe creare thread per gestire la traduzione.

È stato utile?

Soluzione

Suggerirei che, anziché utilizzare eventi, si utilizza una struttura di dati in coda simultanea e un modello di consumo singolo produttore multiplo. Pensa ai thread del lettore tag come ai produttori e al thread di elaborazione come consumatori.

Quando un thread riceve un tag da un lettore, aggiunge quel tag alla coda, non preoccupandosi di duplicati o altro. Cavolo, potresti volere Quelle informazioni duplicate ad un certo punto. Nessun motivo per buttarlo fuori proprio qui.

Il consumatore attende in coda, togliendo gli articoli ed elaborandoli uno alla volta.

Il BlockingCollection La classe è perfetta per questo.

// Shared queue.  Assuming that a tag is simply a string.
BlockingCollection<string> TagQueue = new BlockingCollection<string>();

// Tag reader threads (producers)
while (!ShutdownMessageReceived)
{
    string tag = GetTagFromReader(); // however that's done
    TagQueue.Add(tag);
}

// Processing thread (consumer)
while (!ShutdownMessageReceived)
{
    string tag = TagQueue.Take();
    // process the tag
}

BlockingCollection Supporta più produttori e consumatori, in modo da poter avere il numero di ciascuno di quelli che vuoi. Il Take Il metodo bloccerà fino a quando non sarà disponibile un articolo. È un'attesa non busso, quindi non c'è sondaggio in alto.

Questo genere di cose è molto facile da implementare con BlockingCollection, e crea un codice pulito e semplice che funziona molto bene.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top