2008-10-22 18 views
7

Tengo múltiples procesos monitoreando una cola de MSMQ. Quiero hacer operaciones de varios pasos, como echar un vistazo primero al mensaje y luego, según algunos criterios, recibir el mensaje. Un solo mensaje puede pasar el criterio de recepción de múltiples procesos para que más de un proceso intente recibir el mismo mensaje. ¿Serán estas operaciones seguras para hilos? Si no, ¿qué debo hacer para evitar que un proceso no reciba el mensaje que otro proceso ya recibió?¿Es seguro MSMQ thread?

Respuesta

5

Las operaciones en sí son seguras para hilos. Sin embargo, si realiza una operación de varios pasos, puede encontrar que los resultados no son consistentes (por ejemplo, echar un vistazo para ver si los datos están en la cola, luego llamar para recibir los datos, solo para descubrir que ya no están allí).

+2

Tenga en cuenta: de .NET Framework 4 en adelante, de acuerdo con MSDN, 'Sólo el método GetAllMessages es seguro para subprocesos'. Sugiero actualizar la respuesta para reflejar esto, para que los lectores no se confundan. – Iravanchi

14

Según MSDN:

Sólo los siguientes métodos son seguros hilo: BeginPeek, BeginReceive, EndPeek (IAsyncResult), EndReceive (IAsyncResult), GetAllMessages, Peek, y recibir.

+6

Tenga en cuenta que la versión .Net 4 de la documentación de MessageQueue indica que solo GetAllMessages() es seguro para subprocesos. Asumiré que esto es un cambio real ya que la documentación errónea probablemente se habría actualizado en línea con los documentos de .Net 4. – redcalx

+1

Notablemente, se encontró que el método Send() no era seguro para subprocesos en mi prueba de unidad, bloqueando en el objeto MessageQueue resuelto varias excepciones de nullreference etc. que se estaban lanzando en mi ciclo paralelo. – Kaido

+0

@Kaido: ¿El desbloqueado 'MessageQueue.Send()' dio como resultado errores? ¿O cuál fue el comportamiento que experimentaste? –

6

Quizás te interese un blog entry que escribí sobre este tema.

En resumen, la API MSMQ C++ es segura para subprocesos, pero no todos los métodos System.Messaging son seguros para subprocesos. En la entrada del blog, analizo cómo llamar a MessageQueue.Send de una manera segura para subprocesos.