2012-02-06 26 views
5

Tôi đang tạo một ứng dụng với dịch vụ NetTcpBinding và một số BasicHttpBinding. Thông qua các dịch vụ này, khách hàng gửi yêu cầu đến ứng dụng: các yêu cầu này phải được đưa vào đối tượng Queue, đó là hàng đợi yêu cầu đến.Truy cập đồng thời vào một hàng đợi theo nhiều chủ đề

  1. Cả hai dịch vụ phải cho phép các cuộc gọi đồng thời từ khách hàng.
  2. Điều này có nghĩa là cả hai dịch vụ nên truy cập đồng thời vào hàng đợi để thêm các yêu cầu đã nhận.
  3. Ngoài ra, một chuỗi khác phải truy cập hàng đợi để nhận và xử lý yêu cầu.

Tôi có thể sử dụng ConcurrencyMode.Multiple và có thể thực hiện nhiều cuộc gọi cùng một lúc. Tuy nhiên, điều này không đảm bảo quyền truy cập đồng thời vào hàng đợi. Tôi có nên đặt hai ServiceHost vào hai luồng khác nhau không? Ví dụ:

  • Chủ đề đầu tiên dequeues và xử lý các yêu cầu trong hàng đợi.
  • Tuyến thứ hai khởi tạo dịch vụ NetTcpBinding và thêm các yêu cầu mới vào hàng đợi. Hơn nữa, nó sẽ gửi bất kỳ trả lời thông qua gọi lại.
  • Tuyến thứ ba khởi tạo dịch vụ BasicHttpBinding và thêm các yêu cầu mới vào hàng đợi.

Đây là ý tưởng của tôi. Vì tôi gần như là một newbie, tôi sẽ biết ơn nếu bạn có thể cho tôi một số lời khuyên. Có lẽ tôi nên bắt đầu viết ba chủ đề truy cập vào hàng đợi đồng thời: cho thời điểm hai chủ đề đầu tiên có thể enqueue yêu cầu ngẫu nhiên vào hàng đợi, trong khi chủ đề thứ ba tiêu thụ các yêu cầu này.

+2

Bạn có bị ràng buộc với Hàng đợi không? Bạn có thể sử dụng ConcurrentQueue hoặc BlockingCollection không? Đây là một vấn đề tiêu dùng/sản xuất khá tiêu chuẩn. – Joe

+0

@Joe: Hiện tại tôi nên sử dụng các bộ sưu tập không an toàn, như 'Queue',' Dictionary', ect .. – enzom83

+0

Bất kỳ lý do cụ thể nào? Bạn chỉ cần reimplementing bánh xe rất có thể. – Joe

Trả lời

3

Vì bạn tự mô tả mình là "Tôi gần như là một người mới" Tôi sẽ đề nghị bạn đọc tổng quát hơn - Threading in C# Joseph Albahari bài viết/sách trực tuyến miễn phí. Nó triệt để xem xét các vấn đề và thiết bị đo luồng trong C#.

Tôi đảm bảo với bạn, đọc kỹ các phần 3 và 4 (và xem lại phần 1 và 2) sẽ cung cấp cho bạn các công cụ để giải quyết không chỉ vấn đề hiện tại mà còn là một loạt các vấn đề khác mà bạn sẽ gặp trên đường đa luồng.

Nếu bạn chỉ muốn có câu trả lời nhanh cho câu hỏi của mình, chỉ cần làm theo câu trả lời của Yahia.

9

NẾU bạn đang sử dụng .NET 4, bạn nên xem xét ConcurrentQueue<T>BlockingCollection.

Về cơ bản đây là các bộ sưu tập an toàn chỉ được triển khai cho hiệu suất cao và hầu hết không có khóa.

BlockingCollection được triển khai cụ thể cho Kịch bản sản xuất-người tiêu dùng như mô tả bạn mô tả.

Để tham khảo see:

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