2012-02-16 25 views
17

Tôi hiện đang sử dụng LimitedConcurrencyLevelTaskScheduler chi tiết tại đây http://msdn.microsoft.com/en-us/library/ee789351.aspx.Net TPL: Limited Concurrency Cấp Task Scheduler với nhiệm vụ ưu tiên?

Tôi muốn nâng cao điều này để các tác vụ cá nhân có thể được chỉ định ưu tiên. Những ưu tiên này không cần ánh xạ tới ưu tiên luồng. Nó chỉ ảnh hưởng đến thứ tự các nhiệm vụ được bắt đầu.

Có ai biết ví dụ về trình lên lịch tác vụ như vậy không? (rất nhiều công cụ lập kế hoạch trên đầu của tôi nên sẽ tuyệt vời nếu có giải pháp hiện có)

+0

Đó scheduler sử dụng một LinkedList cho một hàng đợi. Hãy thử thay đổi nó thành một SortedList trong đó T là một cấu trúc giữ một Task và một số nguyên cho priority, và sắp xếp danh sách trên T.Priority. –

+1

@IgbyLargeman - [SortedList] (http://msdn.microsoft.com/en-us/library/ms132319.aspx) có thể không phải là giải pháp lý tưởng - các khóa (ưu tiên) phải là duy nhất. Hầu hết các hệ thống ưu tiên chỉ có một vài cấp độ và cho phép nhiều mục được chỉ định cùng mức độ ưu tiên –

+0

đó là một ý tưởng tồi. Một hàng đợi có nội bộ một tập hợp (mảng) của hàng đợi - một cho mọi ưu tiên - là một cách tốt hơn. Các ưu tiên không phải là duy nhất và chỉ giới hạn ở một số lượng nhỏ. Cũng không sử dụng một danh sách liên kết - Tôi có một "hàng đợi" mà nội bộ sử dụng mảng của 4096 yếu tố, cộng với opointers. phân bổ ít hơn nhiều - các mục được xóa khỏi "trang" phía trước, được thêm vào thứ hai. Phân bổ ít hơn, ít rác hơn để thu thập. – TomTom

Trả lời

37

Parallel Extensions Extras Samples. đã cung cấp bộ lập lịch như vậy, QueuedTaskScheduler. Trình lên lịch này cung cấp mức độ ưu tiên, giới hạn đồng thời, công bằng và kiểm soát chi tiết hơn đối với loại và mức độ ưu tiên của chuỗi được sử dụng. Tất nhiên, bạn không phải sử dụng hoặc cấu hình các tính năng bạn không cần.

Stephen Toub cung cấp một mô tả ngắn gọn về các schedulers khác nhau trong Extensions Extras Parallel here

Để sử dụng QueuedTaskScheduler, bạn gọi phương thức ActivateNewQueue của nó với các ưu tiên mà bạn cần. Phương thức này trả về một đối tượng Queue có nguồn gốc TaskScheduler mới được quản lý bởi TaskScheduler cha. Tất cả các tác vụ sử dụng một hàng đợi cụ thể được lên lịch bởi TaskScheduler phụ huynh theo các ưu tiên của chúng.

Đoạn mã sau tạo một lịch trình với một mức độ đồng thời tối đa là 4, hai hàng đợi ưu tiên và lịch trình một nhiệm vụ trên hàng đợi đầu tiên:

QueuedTaskScheduler qts = new QueuedTaskScheduler(TaskScheduler.Default,4); 
TaskScheduler pri0 = qts.ActivateNewQueue(priority: 0); 
TaskScheduler pri1 = qts.ActivateNewQueue(priority: 1); 

Task.Factory.StartNew(()=>{ }, 
         CancellationToken.None, 
         TaskCreationOptions.None, 
         pri0); 
+0

+1: Tính năng mở rộng song song là vô giá! – dotnetguy

1

Sử dụng một số cấu trúc dữ liệu được sắp xếp hoặc ưu tiên cho danh sách nhiệm vụ. Sau đó, tạo thêm của riêng bạn mà có trong ưu tiên. Điều này có thể không tốt như những người khác nhưng nó sẽ ưu tiên Danh sách công việc. Bạn có thể sử dụng lại 99% mã ở đó. Đơn giản chỉ cần thay thế LinkedList với một danh sách Sắp xếp hoặc sử dụng LINQ để sắp xếp và viết một phương thức bổ sung có mức độ ưu tiên.

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