一开始创建Thread1~5.然后每个Thread下都定义一个定时器单独处理一个事务,因为需要准确的间隔时间,比如在1,3,5,7…等分钟下执行 (不考虑用时间累加,感觉资源消耗特大)

解决方案 »

  1.   

    使用System.Threading.Timer的话本身就是多线程的。在你的线程中启动timer.timer到了之后会启动个线程执行timer的函数。
    参考:
    *****************************************************************************
     在应用程序中需要一个定时器来引发一个定期的任务一定不一般。例如,如果你的程序在窗体的状态条上显示当前时间,你可能每5秒钟更新一次时间。System.Threading 名字空间包括了一个名为Timer多线程定时器类。     当你创建一个定时器类的实例时,你为定时器回调指明了一个以毫秒为单位的周期,而且你也传递给该对象一个委托用来每过一个时钟周期调用你。回调发生在线程池中的线程上。事实上,每次时钟周期到来时真正发生的是一个工作条目在线程池中排队;一般来说一个调用会马上发生的,但是如果线程池比较忙,这个回调也许会在稍后的一个时间点发生。     如果你考虑在你的程序中使用多线程,你也许会考虑使用定时器类。然而,如果你的程序使用了Windows窗体,你不必使用多线程的行为,在System.Windows.Forms名字空间中有另外一个也叫Timer的定时器类。     System.Windows.Forms.Timer与其多线程的同伴比起来有一个明显的好处:因为它不是多线程的,所以不会在其它线程中对你进行回调,而且更适合为应用程序提取窗口消息的主线程。实际上System.Windows.Forms.Timer的实现是在系统中使用了WM_TIMER的一个窗口消息。这种方法在你的System.Windows.Forms.Timer的事件处理器中不必担心线程同步,线程间通信之类的问题。     对于Windows窗体类程序,作为一个很好的技巧就是使用System.Windows.Forms.Timer类, 除非你特别需要线程池中的线程对你进行回调。既然这种要求很少见,为了使事情简单,把使用System.Windows.Forms.Timer作为一个规则,即使在你的程序的其它地方使用了多线程。 
    *****************************************************************************
      

  2.   

    使用System.Threading.Timer的话本身就是多线程的。在你的线程中启动timer.timer到了之后会启动个线程执行timer的函数。
      

  3.   

    findcaiyzh:
    我的意思是,我可能有50个不同时间周期的任务。然后需要分成50个Thread来独立执行每一个任务。
    这样的话 用 System.Threading.Timer 怎么处理呢?
      

  4.   


    //开始可以把this.timer1.Interval=10000;按自己的需要定义,只要保证3点的时候能执行清理就可以了
            private void timer1_Tick(object sender, EventArgs e)
            {
                int nowtime = DateTime.Now.TimeOfDay.Minutes;
                int time = new TimeSpan(3, 0, 0).Minutes;
                int aftertime=new TimeSpan(3,10,0).Minutes;
                if (nowtime == time)
                {
                  //定时执行任务                //执行完成后
                    this.timer1.Interval=2分钟执行一次;或其他,只要不小于1分钟
                }
                if(nowtime == aftertime)
                {
                    this.timer1.Interval=原来设定的值;
                    //这样避免在1分钟内连续执行清理
                }
            }多个Timer就是多线程了哦,你不会是要用50多个Timer吧,有点恐怖。。没用过。。
      

  5.   

    带参数的线程就可以解决.无需定义50个TIMERusing System;
    using System.Collections.Generic;
    using System.Text;
    using System.Threading;namespace paramThread_1
    {
        class Program
        {
            int interval = 200;        static void Main(string[] args)
            {
                Program p = new Program();
                Thread paramThread = new Thread(new ParameterizedThreadStart(p.ParamRun));            paramThread.Name = "Thread_A:";
                paramThread.Start(100);            //启动第二个线程  
                paramThread = new Thread(new ParameterizedThreadStart(p.ParamRun));
                paramThread.Name = "Thread B:";
                paramThread.Start(200);
            }        public void ParamRun(object ms)
            {
                int j = 10;
                int.TryParse(ms.ToString(), out j);
                for (int i = 0; i < 10; i++)
                {
                    Console.WriteLine(Thread.CurrentThread.Name + "系統當前毫秒值:" + DateTime.Now.Millisecond.ToString());
                    Thread.Sleep(j);
                }
                Console.ReadKey();
            }
        }
    }
      

  6.   

    jsoner:
    我想用定时器,不想用 Thread.Sleep,Thread.Sleep貌似是延时处理,我需要的是某时刻运行!
      

  7.   

    1.
    class Task
    {
         WorkTime,
         Work(){new Thread()},
         DataFormTask[],
         delegate Callback;
    }2.List<Task> tasks=new List<Task>() and Sort by Task.WorkTime3.new Timer(1000).Tick+=delegate
    {
        foreach(Task task in tasks)
        {
            if (task.WorkTime == Now)
                 task.Work();
            else//遇到还没到时间的,直接跳出,因为后面的任务肯定也还没到时间点
                 break;
        }
    }
    任务排序后放入集合,这样,如果有一个任务的时间还没到,那么后面的任务肯定也还没到时间点
    在一个计时器中,判断任务到了时间点没,用循环,是怕有多个任务的时间点一样。