2010-09-25 35 views
5

Tôi đang viết một chương trình mà một chủ đề cần đẩy các mục lên hàng đợi và một hoặc nhiều chủ đề xuất hiện các mục ra khỏi hàng đợi và xử lý chúng. Để tránh hết bộ nhớ, tôi muốn chuỗi nhà sản xuất ngủ khi hàng đợi đầy. Một số mục có mức độ ưu tiên cao hơn các mục khác, vì vậy tôi muốn những mục đó được xử lý trước tiên. Nếu các mục có cùng mức độ ưu tiên, tôi muốn mục được thêm trước tiên sẽ được xử lý trước tiên.Hàng đợi ưu tiên có thể theo dõi chuỗi an toàn được đệm?

Tôi muốn hiển thị 100 mục hàng đầu hoặc trong WPF DataGrid, vì vậy nó cũng cần được truy cập bằng một chuỗi giao diện người dùng. Sẽ rất tuyệt nếu nó có thể thông báo cho chuỗi giao diện người dùng rằng đã có bản cập nhật, tức là, triển khai IObservable.

Có lớp chứa nào sẽ làm tất cả điều này không?

Đối với điểm thưởng, tôi chắc chắn rằng toàn bộ hàng đợi không cần phải bị khóa cả khi đang enqueing và dequeing.

Triển khai .NET 4 là tốt.

+0

BlockingCollection http://msdn.microsoft.com/en-us/library/dd997371.aspx âm thanh hứa hẹn ... nhưng nó không đề cập đến bất kỳ điều gì về các ưu tiên. Nó nói rằng nó có thể đóng gói bất cứ thứ gì thực hiện IProducerConsumerCollection ... có một trong số đó là hàng đợi ưu tiên không? – mpen

+0

Xem ví dụ này http://msdn.microsoft.com/en-us/library/dd460690.aspx –

+1

Các tác vụ FWIW có thể được chuyển thành các quan sát Rx. ;) –

Trả lời

2

Nếu bạn đang sử dụng .NET 4, bạn nên cân nhắc nghiêm túc Task Parallel Library bằng trình lập lịch tùy chỉnh như ví dụ QueuedTaskScheduler. Tôi không chắc nó đáp ứng tất cả các yêu cầu của bạn, nhưng nó sẽ là một khởi đầu tốt.

+0

-1 ... không giải quyết bất kỳ vấn đề nào mà người dùng đã đề cập. – TomTom

+1

Tôi có thể đã bị đánh dấu với câu trả lời của tôi, nhưng tôi mạnh mẽ không đồng ý rằng nó không thể giải quyết vấn đề. Việc xử lý dữ liệu trên các luồng chuyên dụng có hiệu quả được sắp xếp theo thứ tự của dữ liệu trong bộ sưu tập. Nhiệm vụ là trừu tượng mức cao hơn có thể đóng gói dữ liệu và xử lý dữ liệu mà không cần xử lý trực tiếp với các luồng - có nhiều lợi ích. Trong một kịch bản như vậy, việc lên lịch có thể đạt được thông qua công cụ lập lịch tác vụ thay thế. –

3

Bạn đang hết may mắn tìm kiếm vùng chứa - bạn phải tự mình triển khai. Hãy cẩn thận với các ưu tiên - phân loại sẽ chậm nhanh. Những gì tôi làm là tôi có một lớp hàng đợi thực hiện bản thân mình rằng nội bộ sử dụng nhiều mảng (một trong mỗi ưu tiên được mã hóa thấp, trung bình, cao). Bằng cách này tôi không bao giờ sắp xếp. Tránh khóa nếu bạn có thể (đa lõi giả định) và đi cho Spinlocks (.NET 4.0), chúng nhanh hơn/mang ít chi phí hơn trong một kịch bản hàng đợi.

+0

Tôi sẽ không bao giờ sử dụng toàn bộ bộ sưu tập mỗi lần chèn ... điều đó thật điên rồ. Tôi muốn sử dụng nhiều mảng (hoặc hàng đợi) như bạn đề nghị, hoặc một số loại cấu trúc cây. – mpen

+0

Cấu trúc cây chậm hơn nhiều hàng đợi (nhưng hiệu quả hơn nếu số lượng các ưu tiên có thể là CAO - hiếm khi có ý nghĩa). Cây tái cân bằng là giá địa ngục khôn ngoan, và bạn không bao giờ cần phải tìm kiếm trong họ anyway trong một hàng đợi. – TomTom

2

Những gì tôi đã thực hiện trong quá khứ được gói nhiều bộ sưu tập ConcurrentQueue<T> thành một - loại số TomTom suggests. Điều này là khá hợp lý khi số lượng ưu tiên bạn dự định có là thấp. Ví dụ trong một số trường hợp, nó thậm chí có thể đủ để có hai: cao và thấp. Sau đó, phương pháp TryDequeue của bạn chỉ cần trông giống như sau:

public bool TryDequeue(out T item) 
{ 
    return _highItems.TryDequeue(out item) || _lowItems.TryDequeue(out item); 
} 

Đây không phải là chính xác một câu trả lời toàn diện cho câu hỏi của bạn, nhưng có lẽ nó có thể giúp bạn bắt đầu.

+0

Tôi không thích giới hạn số lượng ưu tiên có thể. Tôi muốn sử dụng giá trị được tính cho mức độ ưu tiên và tôi không biết phạm vi trước đó. – mpen

+0

@Mark: Đôi khi mọi người làm điều này với thứ gì đó như 'SortedList >' nội bộ; nhưng như TomTom đã đề cập, chi phí của các ưu tiên không giới hạn có thể sẽ không đáng giá. Điều gì về một thỏa hiệp: có một giá trị tính toán được dịch sang một ưu tiên được xác định trước dựa trên nơi nó nằm trong một phạm vi nhất định? –

+0

Yeah ... Tôi nghĩ có lẽ đó là những gì tôi nên làm. Tôi ghét đặt những hạn chế tùy ý vào mọi thứ, nhưng tôi đoán tôi đang tạo ra quá nhiều công việc cho bản thân mình nếu không. Tôi đã được một nửa thông qua thực hiện nó w/'SortedDictionary >' khi tôi nhận ra tôi sẽ phải khóa cấu trúc cả khi enqueuing và dequeing để tôi có thể quản lý các phím, trong đó lấy đi một số đồng thời lợi ích :( – mpen

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