C#System.Threading.Timer延迟执⾏以及定时器
有时候我们需要实现延迟执⾏,或者是定时执⾏,这个时候可以使⽤System.Threading.Timer
Timer4个参数
TimerCallback callback:执⾏的函数,需要传⼊⼀个object类型的参数
object state:callback传⼊的参数的值,如果没有的话写成null
int dueTime:延迟执⾏的时间,即⼏毫秒后执⾏操作,单位毫秒
int period:定时执⾏的时间,即每隔⼏毫秒后执⾏⼀次操作,单位毫秒
如果要实现延迟执⾏的效果,那就传⼊dueTime,并且把period设置成-1或者Timeout.Infinite
/// <summary>
/// 延迟3秒后执⾏
/// </summary>
static void Test1() {
Console.WriteLine(DateTime.Now + " 开始...");
Timer timer = new Timer(args => {
try {
Console.WriteLine(DateTime.Now + " 执⾏操作");
} catch (Exception) {
}
}, null, 3000, Timeout.Infinite);
Console.WriteLine(DateTime.Now + " 等待中...");
}timeout on t2 timer
  如果要实现定时执⾏的效果,就可以传⼊period数值,dueTime如果传⼊0的话,定时器就会在启动后⽴刻执⾏⼀次
/// <summary>
/// ⽴刻执⾏⼀次后每隔2秒执⾏⼀次
/// </summary>
static void Test2() {
Console.WriteLine(DateTime.Now + " 开始...");
Timer timer = new Timer((p) => {
try {
Console.WriteLine(DateTime.Now + " 执⾏操作");
} catch (Exception) {
}
}, null, 0, 2000);
Console.WriteLine(DateTime.Now + " 等待中...");
}
  定时执⾏很爽,但是如果业务代码异常了或者是阻塞了,Test2依然会继续循环调⽤,不断的申请资源,⼀个处理不好,就很容易导致系统崩溃,那么有咩有什么办法能让Timer业务不执⾏完就不开始下⼀个任务呢,答案是可以的,就是利⽤Timer的Change函数来每次延迟执⾏
/// <summary>
/// 每次延迟2秒执⾏,执⾏完毕后再延迟2秒
/// </summary>
static void Test3() {
Console.WriteLine(DateTime.Now + " 开始...");
Timer timer = null;
timer = new Timer((arg) => {
try {
Console.WriteLine(DateTime.Now + " 延迟执⾏到了");
Thread.Sleep(3000); //模拟3秒的操作耗时
Console.WriteLine(DateTime.Now + " 执⾏操作");
} catch (Exception) {
} finally {
timer.Change(2000, Timeout.Infinite);  //执⾏完3秒的操作后,再延迟2秒后执⾏
}
}, null, 2000, Timeout.Infinite);  //第⼀次延迟2秒执⾏
}
还有就是这个Timer不要像我这样在⽅法中当作局部变量使⽤,因为资源紧张的时候GC有可能会把它给回收了,
Test1和Test3延迟执⾏不存在这个问题,但是Test2是循环执⾏就会出现这个问题,如果资源紧张,可能循环⾛着⾛着就没了
所以⽤的时候⼀定要避免在⽅法中作为局部变量⽤,最好是把创建的Timer对象指向⼀个⾮局部变量

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。