那麼,我會更傾向於像下面這樣的東西......你想
首先,啓動所有的線程:
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 });
}
}
爲什麼不使用Quartz.Net? – 2011-02-07 18:24:19
那麼,我的調度方案純粹是基於優先級的,而某些工作需要根據新的工作到達來停止。石英網可以幫我嗎? – nobody 2011-02-07 18:29:10
不確定停止正在運行的作業,但Quartz.Net確實具有基於優先級的處理。 – 2011-02-07 18:32:23