2008-10-22 28 views
7

Tôi có nhiều quy trình giám sát hàng đợi MSMQ. Tôi muốn thực hiện các thao tác đa bước như lần đầu tiên xem tin nhắn và sau đó dựa trên một số tiêu chí nhận được thông báo. Một thông báo có thể vượt qua tiêu chí nhận của nhiều quy trình để nhiều quá trình có thể cố gắng nhận cùng một thông báo. Các hoạt động này có phải là luồng an toàn không? Nếu không phải tôi nên làm gì để ngăn chặn một quá trình không nhận được thông báo rằng quy trình khác đã nhận được?Chủ đề MSMQ có an toàn không?

Trả lời

5

Bản thân các hoạt động là an toàn. Tuy nhiên, nếu bạn thực hiện thao tác nhiều bước, bạn có thể thấy rằng các kết quả không nhất quán (ví dụ, nhìn trộm để xem liệu dữ liệu có nằm trong hàng đợi không, sau đó gọi để nhận dữ liệu, chỉ để khám phá nó không còn nữa).

+2

Xin lưu ý: từ .NET Framework 4 trở đi, theo MSDN, 'Chỉ phương thức GetAllMessages là an toàn luồng '. Tôi đề nghị cập nhật câu trả lời để phản ánh điều này, để người đọc sẽ không bị nhầm lẫn. – Iravanchi

14

Theo MSDN:

Chỉ có phương pháp sau đây là thread an toàn: BeginPeek, BeginReceive, EndPeek (IAsyncResult), EndReceive (IAsyncResult), GetAllMessages, Peek, và Nhận.

+6

Xin lưu ý rằng phiên bản .Net 4 của tài liệu cho MessageQueue nói rằng chỉ GetAllMessages() là luồng an toàn. Tôi sẽ giả định đây là một thay đổi thực sự vì tài liệu sai lầm có lẽ đã được cập nhật trực tuyến với tài liệu .Net 4. – redcalx

+1

Đáng chú ý là phương thức Send() được tìm thấy không phải là chủ đề an toàn trong bài kiểm tra đơn vị của tôi, khóa đối tượng MessageQueue đã giải quyết các ngoại lệ khác nhau của nullreference vv đã được ném vào vòng lặp song song của tôi. – Kaido

+0

@Kaido: Lỗi 'MessageQueue.Send()' có bị lỗi không? Hoặc hành vi bạn trải qua là gì? –

6

Bạn có thể quan tâm đến một blog entry Tôi đã viết về chủ đề này.

Tóm lại, MSMQ C++ API là chuỗi an toàn, nhưng không phải tất cả các phương thức System.Messaging đều là an toàn. Trong bài viết trên blog, tôi thảo luận cách gọi MessageQueue.Gửi theo một cách an toàn.

Các vấn đề liên quan