我有个程序,需要从数据库里读取工作项的信息,结果如:work1,work2,work3...
每个工作项都有自己的运行间隔时间(每隔一段时间运行一次),如work1每隔10分钟执行一次,work2每隔5分钟执行一次,这个间隔时间也是随工作项信息一起读出来的。
所有的工作项一共归为4类(类别数量不变)。
现在要在程序启动时开始工作,要求:
不能每个工作项建立一个线程(开始是这样想的,后来被否),
而是根据类别建立四个线程,每个线程里运行各自的工作项,并且还得保证每个工作项依旧按照自己的时间间隔来不停运行。
不知道说的名不明白,请求高手给个解决方案。谢谢了!!

解决方案 »

  1.   

    “而是根据类别建立四个线程,每个线程里运行各自的工作项,并且还得保证每个工作项依旧按照自己的时间间隔来不停运行。 ”问:类别相同的工作项的执行周期都是一样的吗?如果不是,按2楼说的,1个轮询线程+线程池就OK了。用4个线程反而麻烦,不过思路一样参考2楼,每个线程仅轮询特定类别的工作项是否应该启动,后续做法不变。如果不想用轮询,也可以读取工作项的周期后即可作出一个先后排序,并记录每二者之间的时差,线程先sleep到第一项的时间,把它丢进线程池去执行,并把该项加入重新插入到任务列表的合适位置,计算其下次执行时间与位置前一项的时差并记录。之后继续sleep直到第2项时间到,再重复……替换轮询的思路无论1线程还是4线程都一样的。任务项的具体执行推荐放入线程池中独立执行。
      

  2.   

    “我想在读取工作项的时候建立一个时间轴,把所有工作项的执行时间记录下来(设定个半年的),然后用个线程判断,到达哪个时间点了就执行当前时间点需要执行的工作项”如果你不想用轮询,建议采用我在8楼讲的替换方法,比预先设定半年一载的时间轴要好。
    其中有笔误,再整理如下:如果不想用轮询,也可以读取工作项的周期后即刻作出一个先后排序,并记录每二者之间的时差,线程先sleep到第一项的时间,把它丢进线程池去执行,并把该项重新插入到任务列表的合适位置,计算其下次执行时间与位置前一项的时差并记录。之后sleep两项时差,则刚好第2项时间到,再重复上一过程。
     
      

  3.   

     static void Main(string[] args)
            {            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);
                }
            }
      

  4.   

    public interface IWork{

    }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。