C# 多线程 03-使用线程池 06-使用计时器
🏷️ 《C# 多线程》
使用 System.Threading.Timer
对象在线程池中创建周期性调用的异步操作。
csharp
/// <summary>
/// 使用计时器
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
Console.WriteLine("Press 'Enter' to stop the timer ...");
DateTime start = DateTime.Now;
// 第一个参数为定时器定时执行的处理
// 第三个参数为多长时间后第一次执行
// 第四个参数为第一次执行之后再次调用的间隔时间
_timer = new Timer(_ => TimerOperation(start), null, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(2));
try
{
Thread.Sleep(TimeSpan.FromSeconds(6));
// 使用 Change 方法改变第一次执行时间和之后再次调用的间隔时间
_timer.Change(TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(4));
Console.ReadLine();
}
catch (Exception)
{
// 注销定时器
_timer.Dispose();
}
}
static Timer _timer;
static void TimerOperation(DateTime start)
{
TimeSpan elapsed = DateTime.Now - start;
Console.WriteLine($"{elapsed.TotalSeconds} seconds from {start}. Timer thread pool thrad id:{Thread.CurrentThread.ManagedThreadId}");
}
打印结果
txt
Press 'Enter' to stop the timer ...
1.01 seconds from 2017/7/11 9:55:16. Timer thread pool thrad id:4
3.022 seconds from 2017/7/11 9:55:16. Timer thread pool thrad id:4
5.034 seconds from 2017/7/11 9:55:16. Timer thread pool thrad id:4
7.001 seconds from 2017/7/11 9:55:16. Timer thread pool thrad id:4
11.015 seconds from 2017/7/11 9:55:16. Timer thread pool thrad id:4
15.021 seconds from 2017/7/11 9:55:16. Timer thread pool thrad id:4
19.027 seconds from 2017/7/11 9:55:16. Timer thread pool thrad id:4
Timer
的构造函数定义:
csharp
//
// 摘要:
// 新实例初始化 Timer 类,使用 System.TimeSpan 值度量时间间隔。
//
// 参数:
// callback:
// 表示要执行的方法的委托。
//
// state:
// 一个包含回调方法中,要使用信息的对象或 null。
//
// dueTime:
// 在之前的延迟时间量 callback 参数调用其方法。指定 -1 毫秒以防止启动计时器。指定零 (0) 可立即启动计时器。
//
// period:
// 由所引用的方法的调用之间的时间间隔 callback。指定 -1 毫秒可以禁用定期终止。
//
// 异常:
// T:System.ArgumentOutOfRangeException:
// 值中的毫秒数 dueTime 或 period 为负数,并且不等于 System.Threading.Timeout.Infinite, ,或者大于 System.Int32.MaxValue。
//
// T:System.ArgumentNullException:
// callback 参数为 null。
[SecuritySafeCritical]
public Timer(TimerCallback callback, object state, TimeSpan dueTime, TimeSpan period);