I’m leveraging a ConcurrentPriorityQueue – from http://code.msdn.microsoft.com/ParExtSamples.

This class basically is a thread safe IProducerConsumerCollection wrapper for a binary heap that prioritizes smaller values. You use it as you would a dictionary, where the priority is the key, except you can have duplicate keys (ie values with the same priority).
I needed to demonstrate to a customer that it worked.
I set up my queue and my priority enum values:
| var q = new ConcurrentPriorityQueue<int, string>(); var priorityValues = Enum.GetValues(typeof(JobPriority)); |
I then randomly enqueued different priorities from different threads:
var random = new Random(); Parallel.For(0, 1000, i => { var randomPriority = (JobPriority) priorityValues.GetValue(random.Next(priorityValues.Length)); Debug.WriteLine("enqueueing:" + randomPriority); q.Enqueue((int) randomPriority, randomPriority.ToString()); }); |
and finally I asserted that dequeueing occurs in order:
while (q.TryDequeue(out printJobKVP))
{
var jobPriority = (JobPriority)Enum.Parse(typeof(JobPriority), printJobKVP.Value);
Assert.IsTrue(jobPriority >= previousJobPriority);
previousJobPriority = jobPriority;
} |