2012-12-19 19 views
6

Tôi thường có nhu cầu xử lý hàng đợi các mục mà không có người dùng nào có thể chặn hàng đợi và các mục trong hàng đợi sẽ được xử lý theo một số thứ tự. Tôi thường xuyên viết một lớp để làm điều này, nhưng tôi nghĩ rằng nên có một số phiên bản chung chung nhưng tôi không thể tìm thấy một. Vì vậy, tôi đang tìm một lớp hàng đợi, nơi tôi có thể chỉ định một loại, một bộ chọn cho phân vùng và bộ chọn để sắp xếp theo thứ tự mà tôi có thể thêm các đối tượng vào hàng đợi và sau đó khi tôi nhận các đối tượng trở lại, tôi nhận được đối tượng đầu tiên từ phân vùng tiếp theo được sắp xếp theo thứ tự của tôi.Generic C# Round Robin (phân vùng/sắp xếp) Queue

Ví dụ, tôi sẽ gọi như thế này quy định cụ thể như thế nào để phân vùng và làm thế nào để sắp xếp hàng đợi:

var queue = new RoundRobinQueue<Message>(
      _ => _.UserID, 
      _ => _.SendDate 
      ); 

Và sau khi tôi đã thêm rất nhiều tin nhắn, tôi có thể Parallel.ForEach các mục trong hàng đợi và quá trình của tôi theo thứ tự sớm nhất là SendDate cho User tiếp theo. Bằng cách đó, nếu một người dùng chậm, các mục của anh ta sẽ không chặn hàng đợi vì anh ta chỉ nhận được một chuỗi, nhưng nếu chỉ có một người dùng, anh ấy là phân vùng duy nhất để anh ấy nhận được tất cả các chủ đề.

Tôi đã xem xét tất cả nhưng không thể tìm thấy một số chung thực hiện phổ biến trong C# cho việc này. Bất kỳ ý tưởng?

+0

nhu cầu tìm kiếm IEnumerable. Nhưng làm thế nào mà có thể foreach biết khi nào kết thúc nếu bộ sưu tập này, một hàng đợi vòng tròn, luôn luôn có tiếp theo? Bạn có thể buộc phải phá vỡ nó bằng một số đếm hoặc thời gian chờ. Nhưng những người sử dụng của lớp này có thể bị tổn thương nếu họ sử dụng nó sai, ngay cả bản thân bạn. Ví dụ. hàng đợi này có thể được chuyển xung quanh trong mã của bạn dưới dạng IEnumerable, và được chuyển đến một phương thức lấy bất kỳ IEnumerable nào và làm foreach trên nó, Rất tiếc! – Ryan

+0

Tại sao không phải là một phương pháp mở rộng để 'IEnumerable' trả về một Iterator? – PPC

Trả lời

-1

Xem các lớp được xác định trong System.Collections.Concurrent. Có một ConcurrentQueue chung cũng như các khối xây dựng cơ bản hơn cho các mẫu người tiêu dùng sản xuất.

Các lớp và giao diện có sẵn được tóm tắt trên MSDN.