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
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).
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.
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
Đá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
@Kaido: Lỗi 'MessageQueue.Send()' có bị lỗi không? Hoặc hành vi bạn trải qua là gì? –
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.
- 1. Chủ đề SecureRandom có an toàn không?
- 2. Chủ đề NSPersistentStoreCoordinator có an toàn không?
- 3. Chủ đề EPiServer có an toàn không?
- 4. Chủ đề DocumentBuilder.parse() có an toàn không?
- 5. Chủ đề console.writeline có an toàn không?
- 6. Chủ đề này có an toàn không?
- 7. Chủ đề NSFileManager có an toàn không?
- 8. Chủ đề libuv có an toàn không?
- 9. Chủ đề java.util.Hashtable có an toàn không?
- 10. Chủ đề an toàn chủ đề - tĩnh hay không?
- 11. Có an toàn để sử dụng các chức năng chủ đề 'Không an toàn' không?
- 12. Các destructor có nên là chủ đề an toàn không?
- 13. Có an toàn cho chủ đề của PHP không?
- 14. Delphi - Chủ đề TClientDataset có an toàn không?
- 15. Chủ đề PrintWriter của socket Java có an toàn không?
- 16. Chủ đề java.util.Calendar có an toàn hay không?
- 17. NSTimer có phải là chủ đề an toàn không?
- 18. Chủ đề an toàn có được putStrLn không?
- 19. Chủ đề của Win32 Registry có an toàn không?
- 20. Chủ đề Java MulticastSocket có an toàn không?
- 21. Chủ đề protobuf-net có an toàn không?
- 22. Chủ đề Azure ThreadClient có an toàn không?
- 23. Là chủ đề của ImmutableList.Builder có an toàn không?
- 24. Chủ đề phiên Django có an toàn không?
- 25. Chủ đề DataContractSerilaizer của WCF có an toàn không?
- 26. Chủ đề Java Regex có an toàn không?
- 27. Chủ đề lớp Joda-Time DateTimeFormatter có an toàn không?
- 28. Có phải Azure CloudTable là chủ đề an toàn không?
- 29. Chủ đề char [] cuối cùng có an toàn không?
- 30. Chủ đề GHashTable (glib2) có an toàn không?
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