Tôi muốn xếp hàng các tác vụ phụ thuộc vào một số luồng cần được xử lý theo thứ tự (trong mỗi luồng). Các luồng có thể được xử lý song song.C# xếp hàng các nhiệm vụ phụ thuộc để được xử lý bởi một nhóm hồ sơ
Để cụ thể, giả sử tôi cần hai hàng đợi và tôi muốn các tác vụ trong mỗi hàng đợi được xử lý theo thứ tự. Đây là giả mẫu để minh họa cho hành vi mong muốn:
Queue1_WorkItem wi1a=...;
enqueue wi1a;
... time passes ...
Queue1_WorkItem wi1b=...;
enqueue wi1b; // This must be processed after processing of item wi1a is complete
... time passes ...
Queue2_WorkItem wi2a=...;
enqueue wi2a; // This can be processed concurrently with the wi1a/wi1b
... time passes ...
Queue1_WorkItem wi1c=...;
enqueue wi1c; // This must be processed after processing of item wi1b is complete
Dưới đây là một sơ đồ với các mũi tên minh họa phụ thuộc giữa các hạng mục công trình:
Câu hỏi đặt ra là làm thế nào để tôi làm điều này bằng C# 4.0/.NET 4.0? Ngay bây giờ tôi có hai chuỗi công nhân, mỗi luồng một hàng và tôi sử dụng một BlockingCollection<>
cho mỗi hàng đợi. Thay vào đó, tôi muốn sử dụng nhóm chủ đề .NET và có các luồng công việc xử lý đồng thời các mục (qua các luồng), nhưng trong một luồng. Nói cách khác tôi muốn để có thể chỉ ra rằng ví dụ wi1b phụ thuộc vào hoàn thành wi1a, mà không cần phải theo dõi hoàn thành và nhớ wi1a, khi wi1b đến. Nói cách khác, tôi chỉ muốn nói, "Tôi muốn gửi một mục công việc cho queue1, được xử lý serially với các mục khác mà tôi đã gửi cho queue1, nhưng có thể song song với các mục công việc được gửi tới các hàng đợi khác".
Tôi hy vọng mô tả này có ý nghĩa. Nếu không xin vui lòng đặt câu hỏi trong phần bình luận và tôi sẽ cập nhật câu hỏi này cho phù hợp.
Cảm ơn bạn đã đọc.
Cập nhật:
Để tóm tắt "sai lầm" giải pháp cho đến nay, đây là những giải pháp từ phần câu trả lời mà tôi không thể sử dụng và lý do (s) tại sao tôi không thể sử dụng chúng:
TPL các nhiệm vụ yêu cầu xác định tác vụ tiền định trước cho ContinueWith()
. Tôi không muốn duy trì kiến thức về nhiệm vụ tiền nhiệm của mỗi hàng đợi khi gửi một nhiệm vụ mới.
TDF ActionBlocks trông đầy hứa hẹn, nhưng có vẻ như các mục được đăng lên một ActionBlock được xử lý song song. Tôi cần cho các mục cho một hàng đợi cụ thể được xử lý serially.
Cập nhật 2:
RE: ActionBlocks
Nó sẽ xuất hiện mà thiết lập các tùy chọn MaxDegreeOfParallelism
một ngăn xử lý song song của hạng mục công trình nộp cho một đơn ActionBlock
. Do đó có vẻ như có một ActionBlock
mỗi hàng đợi giải quyết vấn đề của tôi với bất lợi duy nhất là điều này đòi hỏi việc cài đặt và triển khai thư viện TDF của Microsoft và tôi đã hy vọng cho một giải pháp .NET 4.0 thuần túy. Cho đến nay, đây là ứng cử viên chấp nhận câu trả lời, trừ khi ai đó có thể tìm ra cách để làm điều này với một giải pháp .NET 4.0 thuần túy không làm thoái hóa chuỗi công việc trên mỗi hàng đợi (mà tôi đã sử dụng).
Bạn đã xem Task/ContinueWith chưa? –
Tôi có và tôi nhận thấy rằng ContinueWith yêu cầu kiến thức về nhiệm vụ trước đó. Tôi muốn không phải theo dõi các nhiệm vụ tiền lệ như được quy định trong câu hỏi ban đầu, một phần vì tôi sẽ phải làm như vậy trên mỗi hàng đợi. Thay vào đó, tôi muốn "cháy và quên" từ điểm đệ trình và xử lý các lỗi và tuyên truyền lỗi trong các thuộc tính xử lý tác vụ (s). Nói cách khác, tôi muốn trạng thái tối thiểu tại thời điểm gửi - mục công việc và hàng đợi sẽ được gửi đến. –