Pregunta

Mi pregunta es para los comentarios sobre cómo asegurarme de que estoy adoptando el enfoque correcto y manejar el roscado correctamente. Tengo la sensación de que es posible que necesite establecer algunos de mis propios hilos, por lo que todos los comentarios son bienvenidos.

El problema que tengo es leer etiquetas RFID de cero o más lectores de RFID. Puedo leer para un solo lector sin un problema, por lo que leer de varios no será un problema. Cada etiqueta o lote de etiquetas leídas por el lector es entregada por un evento .NET.

Mi plan es configurar una clase de ReaderControl, que mantiene los lectores, la conexión, el inicio, la detención, etc. Esta clase escuchará la Etiqueta eventos de los lectores. En cada evento que maneja (aproximadamente cada 250 ms) coloca los ID de etiqueta de lectura (una cadena) en un hashset para mantenerlos únicos, el hashset se encuentra en ReaderControl. El ReaderControl contendrá un temporizador, que dispara/transcurre cada 500 ms, este evento de tiempo temporal es manejado por el ReaderControl que empaquetará las etiquetas leídas de todos los lectores hasta ahora y elevará un Tagsread evento. El propósito de esto es mantener el disparo de eventos al mínimo y reducir las etiquetas duplicadas.

los Tagsreads El evento es manejado por otra clase llamada TagTranslator. Esta clase pasará a través de los ID de etiqueta (cadenas) y resolverá a qué se refiere la etiqueta, es decir, el objeto Iperson. Esta clase disparará un evento al finalizar la traducción con un Gente evento.

los Gente El evento es manejado por un modelo en una GUI (patrón MVP). La idea general es que una pantalla GUI muestra nombres de personas que pasan por los lectores de RFID. La pantalla es de manera simple, pero obviamente debajo de las etiquetas de las campanas, se leen en Asych y se traducen a objetos "reales" que se mostrarán.

¿Sientes que ReaderControl debería funcionar en su propio hilo? Creo que debería. ¿Cómo hago para empacar esta clase en su propio hilo para seguir leyendo etiquetas independientemente de lo que esté haciendo la GUI? Además, ¿cree cuando el TagTranslator al manejar los eventos debería crear hilos para manejar la traducción?

¿Fue útil?

Solución

Sugeriría que, en lugar de usar eventos, usa una estructura de datos de cola concurrente y un modelo de consumidor único de productor múltiple. Piense en los hilos del lector de etiquetas como productores y el hilo de procesamiento como consumidores.

Cuando un hilo recibe una etiqueta de un lector, agrega esa etiqueta a la cola, sin preocuparse por duplicados ni nada. Diablos, podrías desear esa información duplicada en algún momento. No hay razón para tirarlo aquí mismo.

El consumidor espera la cola, quitando los artículos y procesando uno a la vez.

los BlockingCollection La clase es perfecta para esto.

// 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 Admite múltiples productores y consumidores, por lo que puede tener tantos de cada uno como desee. los Take El método se bloqueará hasta que un artículo esté disponible. Es una espera no busca, por lo que no hay sobrecarga de encuestas.

Este tipo de cosas es muy fácil de implementar con BlockingCollection, y hace un código limpio y simple que funciona muy bien.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top