我有个程序,需要从数据库里读取工作项的信息,结果如:work1,work2,work3...
每个工作项都有自己的运行间隔时间(每隔一段时间运行一次),如work1每隔10分钟执行一次,work2每隔5分钟执行一次,这个间隔时间也是随工作项信息一起读出来的。
所有的工作项一共归为4类(类别数量不变)。
现在要在程序启动时开始工作,要求:
不能每个工作项建立一个线程(开始是这样想的,后来被否),
而是根据类别建立四个线程,每个线程里运行各自的工作项,并且还得保证每个工作项依旧按照自己的时间间隔来不停运行。
不知道说的名不明白,请求高手给个解决方案。谢谢了!!
每个工作项都有自己的运行间隔时间(每隔一段时间运行一次),如work1每隔10分钟执行一次,work2每隔5分钟执行一次,这个间隔时间也是随工作项信息一起读出来的。
所有的工作项一共归为4类(类别数量不变)。
现在要在程序启动时开始工作,要求:
不能每个工作项建立一个线程(开始是这样想的,后来被否),
而是根据类别建立四个线程,每个线程里运行各自的工作项,并且还得保证每个工作项依旧按照自己的时间间隔来不停运行。
不知道说的名不明白,请求高手给个解决方案。谢谢了!!
其中有笔误,再整理如下:如果不想用轮询,也可以读取工作项的周期后即刻作出一个先后排序,并记录每二者之间的时差,线程先sleep到第一项的时间,把它丢进线程池去执行,并把该项重新插入到任务列表的合适位置,计算其下次执行时间与位置前一项的时差并记录。之后sleep两项时差,则刚好第2项时间到,再重复上一过程。
{ Thread thread1 = new Thread(work1);
Thread thread2 = new Thread(work2);
Thread thread3 = new Thread(work3);
Thread thread4 = new Thread(work4);
thread1.Start();
thread2.Start();
thread3.Start();
thread4.Start();
}
private static void work1()
{
while (true)
{
Thread.Sleep(2000);//work1 线程停止2秒
Console.WriteLine("work1" + System.DateTime.Now);
}
} private static void work2()
{
while (true)
{
Thread.Sleep(4000);//work1 线程停止4秒
Console.WriteLine("work2" + System.DateTime.Now);
}
} private static void work3()
{
while (true)
{
Thread.Sleep(6000);//work1 线程停止6秒
Console.WriteLine("work3" + System.DateTime.Now);
}
} private static void work4()
{
while (true)
{
Thread.Sleep(8000);//work1 线程停止8秒
Console.WriteLine("work4" + System.DateTime.Now);
}
}
}public class Worker{
public void Do(IWork work){
// do something...
}
}private void DoWork(WorkType type){
while(true){
IWork work = GetWork(type);
worker.Do(work);
}
}Worker worker = new Worker();Thread thread1 = new Thread(delegate{worker.DoWork(WorkType.Type1);});
thread1.Start();Thread thread2 = new Thread(delegate{worker.DoWork(WorkType.Type2);});
thread2.Start();Thread thread3 = new Thread(delegate{worker.DoWork(WorkType.Type3);});
thread3.Start();Thread thread4 = new Thread(delegate{worker.DoWork(WorkType.Type4);});
thread4.Start();这里需要说明的是GetWork方法,该方法通过类型来获得Work(叫Task更好),线程一直处在运行状态,只要该方法能获得IWork对象则使用worker来完成该Task。