//开始可以把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吧,有点恐怖。。没用过。。
带参数的线程就可以解决.无需定义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(); } } }
参考:
*****************************************************************************
在应用程序中需要一个定时器来引发一个定期的任务一定不一般。例如,如果你的程序在窗体的状态条上显示当前时间,你可能每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作为一个规则,即使在你的程序的其它地方使用了多线程。
*****************************************************************************
我的意思是,我可能有50个不同时间周期的任务。然后需要分成50个Thread来独立执行每一个任务。
这样的话 用 System.Threading.Timer 怎么处理呢?
//开始可以把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吧,有点恐怖。。没用过。。
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();
}
}
}
我想用定时器,不想用 Thread.Sleep,Thread.Sleep貌似是延时处理,我需要的是某时刻运行!
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;
}
}
任务排序后放入集合,这样,如果有一个任务的时间还没到,那么后面的任务肯定也还没到时间点
在一个计时器中,判断任务到了时间点没,用循环,是怕有多个任务的时间点一样。