Ну, я бы больше склонялся к чему-то вроде следующего ...
Во-первых, запустите все потоки, которые вы хотите:
for(int i=0; i < Environment.ProcessorCount; i++)
{
Thread t = new Thread(RunWork);
// setup thread
t.Start();
threads.Add(t);
}
Вам потребуется интерфейс для описания приоритетазадачи
interface ITask {
PrioirtyType Prioirty { get; }
bool Complete { get; }
void PerformOneUnitOfWork();
}
Затем создайте объект управления очередью.Это, очевидно, усложняется, поскольку может потребоваться синхронизация с вашей базой данных и т. Д ...
class MyQueue<TJob> where TJob : ITask
{
Queue<TJob> high, med, low;
bool GetNextJob(ref TJob work)
{
if(work.Priority == PriorityType.High && !work.Complete)
return true;
lock(this)
{
if(high.Count > 0)
{
Enqueue(work);//requeue to pick back up later
work = high.Dequeue();
return true;
}
if(work.Priority == PriorityType.Med && !work.Complete)
return true;
if(med.Count > 0)
{
Enqueue(work);//requeue to pick back up later
work = med.Dequeue();
return true;
}
if(!work.Complete)
return true;
if(low.Count > 0)
{
work = low.Dequeue();
return true;
}
work = null;
return false;
}
void Enqueue(TJob work)
{
if(work.Complete) return;
lock(this)
{
else if(work.Priority == PriorityType.High) high.Enqueue(work);
else if(work.Priority == PriorityType.Med) med.Enqueue(work);
else low.Enqueue(work);
}
}
}
И, наконец, создайте свой рабочий поток примерно так:
public void RunWork()
{
ITask job;
while(!_shutdown.WaitOne(0))
{
if(queue.GetNextJob(ref job))
job.PerformOneUnitOfWork();
else
WaitHandle.WaitAny(new WaitHandle[] { _shutdown, queue.WorkReadyHandle });
}
}