No se trata de los diferentes métodos que podría o debería utilizar para utilizar las colas de la mejor manera, más bien algo que he visto que sucede y que no tiene sentido para mí.C# Enhebrado y colas
void Runner() {
// member variable
queue = Queue.Synchronized(new Queue());
while (true) {
if (0 < queue.Count) {
queue.Dequeue();
}
}
}
Esto se ejecuta en un solo hilo:
var t = new Thread(Runner);
t.IsBackground = true;
t.Start();
Otros eventos son "Poner en cola" ing en otro lado. Lo que he visto suceder es a través de un período de tiempo, el Dequeue lanzará InvalidOperationException, cola vacía. Esto debería ser imposible ya que la cuenta garantiza que hay algo allí, y estoy seguro de que nada más es "Dequeue" ing.
La pregunta (s):
- ¿Es posible que la puesta en cola en realidad aumenta el conteo antes de que el artículo es totalmente en la cola (sea lo que sea ...)?
- ¿Es posible que el hilo se esté reiniciando de alguna manera (caducando, reiniciando ...) en la declaración Dequeue, pero inmediatamente después de que ya eliminó un elemento?
Editar (clarificación):
Estas piezas de código son parte de una clase de contenedor que implementa el subproceso de fondo ayudante. El Dequeue aquí es el único Dequeue, y todos Enqueue/Dequeue están en la variable miembro sincronizada (queue).
Debido a la respuesta de Ryan ... ¿es este el código real o simplemente un ejemplo simplificado? Si es el código real, realmente deberías pensar en cambiar el ciclo: consultar la cola en lugar de sincronizar el lector con los escritores es un diseño pobre. Está desperdiciando millones de ciclos de procesador para calentar la habitación. –
Este es un ejemplo para llegar a la carne del problema. Hay un Thread. Sleep allí, el procesador no está siendo martillado. La razón por la que opté por un proceso de votación en lugar de lectura/escritura de sincronización se debe al hecho de que la cola tiene algo casi todo el tiempo. En nuestro baúl, aunque he agregado un AutoResetEvent para jugar. Como dije en la parte superior, no estoy terriblemente preocupado por la implementación aquí. Parece que hay un problema real con este modelo de enhebrado, ya sea correcto o incorrecto. – neouser99
Al mirar tu código, al menos tienes el hilo principal y el hilo donde crees que se llama a Dequeue. Por qué no nombrar sus hilos, y cada vez que se llama a Dequeue, ingrese el nombre del hilo con un seguimiento de la pila. Es posible que encuentre algo en el hilo principal que se comporte de una manera que no esperaba. –