2012-02-06 13 views
5

Estoy creando una aplicación con un servicio NetTcpBinding y uno BasicHttpBinding. A través de estos servicios, los clientes envían solicitudes a la aplicación: estas solicitudes se deben poner en un objeto Queue, que es la cola de la solicitud entrante.Acceso concurrente a una cola por múltiples hilos

  1. Ambos servicios deben permitir llamadas simultáneas de los clientes.
  2. Esto significa que ambos servicios deben tener acceso concurrentemente a la cola para agregar las solicitudes recibidas.
  3. Además, otro hilo debe acceder a la cola para obtener y procesar las solicitudes.

Pude usar ConcurrencyMode.Multiple y pude hacer tantas llamadas al mismo tiempo. Sin embargo, esto no garantiza un acceso concurrente a la cola. ¿Debo poner los dos ServiceHost en dos hilos diferentes? Por ejemplo:

  • El primer hilo dequeue y procesa las solicitudes en la cola.
  • El segundo subproceso crea una instancia del servicio NetTcpBinding y encola nuevas solicitudes en la cola. Además, envía respuestas a través de la devolución de llamada.
  • El tercer hilo crea una instancia del servicio BasicHttpBinding y encola nuevas solicitudes en la cola.

Esta es mi idea. Como soy casi un novato, le agradecería que me diera algunos consejos. Tal vez debería comenzar a escribir tres subprocesos que acceden a la cola de forma simultánea: por el momento, los primeros dos subprocesos pueden enrutar solicitudes aleatorias a la cola, mientras que el tercer subproceso consume estas solicitudes.

+2

¿Está obligado a Queue? ¿Puedes usar un ConcurrentQueue o un BlockingCollection? Este es un problema productor/consumidor bastante estándar. – Joe

+0

@Joe: Por ahora debería usar colecciones que no sean seguras para subprocesos, como 'Queue',' Dictionary', ect .. – enzom83

+0

¿Alguna razón en particular por qué? Simplemente estás reimplementando la rueda lo más probable. – Joe

Respuesta

3

Puesto que usted caracterizarse como "Soy casi un novato" Le sugiero que lea en general - Threading in C# Joseph Albahari artículo/libro gratuito en línea. Revisa a fondo los problemas y la instrumentación de enhebrar en C#.

Te aseguro que una lectura cuidadosa de las partes 3 y 4 (y repasando las partes 1 y 2) te dará las herramientas para resolver no solo tu problema actual, sino muchos otros problemas que encontrarás en el camino de multihilo.

Si solo quiere una respuesta rápida a su pregunta, simplemente siga la respuesta de Yahia.

9

SI está en .NET 4 debe consultar ConcurrentQueue<T> y BlockingCollection.

Básicamente, estas colecciones son seguras para la ejecución de subprocesos y se implementan para un alto rendimiento, y en su mayoría están libres de cerrojo.

BlockingCollection está específicamente implementado para Escenarios del consumidor del productor como el que usted describe.

Para referencia, véase:

Cuestiones relacionadas