Skip to content

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);