本文实例讲述了C#多线程学习之使用定时器进行多线程的自动管理。分享给大家供大家参考。具体分析如下:

Timer类:设置一个定时器,定时执行用户指定的函数。

定时器启动后,系统将自动建立一个新的线程,执行用户指定的函数。

初始化一个Timer对象:

?
1
Timer timer = new Timer(timerDelegate, s,1000, 1000);

第一个参数:指定了TimerCallback 委托,表示要执行的方法;
第二个参数:一个包含回调方法要使用的信息的对象,或者为空引用;
第三个参数:延迟时间——计时开始的时刻距现在的时间,单位是毫秒,指定为“0”表示立即启动计时器;
第四个参数:定时器的时间间隔——计时开始以后,每隔这么长的一段时间,TimerCallback所代表的方法将被调用一次,单位也是毫秒。指定 Timeout.Infinite 可以禁用定期终止。

Timer.Change()方法:修改定时器的设置。(这是一个参数类型重载的方法)
使用示例:

?
1
timer.Change(1000,2000);

Timer类的程序示例(来源:MSDN):

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
using System;
using System.Threading;
namespace ThreadExample
{
 class TimerExampleState 
 {
 public int counter = 0;
 public Timer tmr;
 }
 class App 
 {
 public static void Main()
 {
 TimerExampleState s = new TimerExampleState();
 //创建代理对象TimerCallback,该代理将被定时调用
 TimerCallback timerDelegate = new TimerCallback(CheckStatus);
  //创建一个时间间隔为1s的定时器
  Timer timer = new Timer(timerDelegate, s,1000, 1000);
  s.tmr = timer;
  //主线程停下来等待Timer对象的终止
  while(s.tmr != null)
  Thread.Sleep(0);
  Console.WriteLine("Timer example done.");
  Console.ReadLine();
 }
 //下面是被定时调用的方法
 static void CheckStatus(Object state)
 {
  TimerExampleState s =(TimerExampleState)state;
  s.counter++;
  Console.WriteLine("{0} Checking Status {1}.",DateTime.Now.TimeOfDay, s.counter);
  if(s.counter == 5)
  {
  //使用Change方法改变了时间间隔
  (s.tmr).Change(10000,2000);
  Console.WriteLine("changed");
  }
  if(s.counter == 10)
  {
  Console.WriteLine("disposing of timer");
  s.tmr.Dispose();
  s.tmr = null;
  }
 }
 }
}

程序首先创建了一个定时器,它将在创建1秒之后开始每隔1秒调用一次CheckStatus()方法,当调用5次以后,在CheckStatus()方 法中修改了时间间隔为2秒,并且指定在10秒后重新开始。当计数达到10次,调用Timer.Dispose()方法删除了timer对象,主线程于是跳 出循环,终止程序。

转载于:https://www.cnblogs.com/zxtceq/p/5667327.html

C#多线程学习之(五)使用定时器进行多线程的自动管理相关推荐

  1. Java之多线程学习笔记五 —— 多线程模拟龟兔赛跑

    Java之多线程学习笔记五 -- 多线程模拟龟兔赛跑 参考教程B站狂神https://www.bilibili.com/video/BV1V4411p7EF package pers.ylw.less ...

  2. Java多线程学习笔记20之定时器Timer

    详细代码见:github代码地址 本节内容: 定时器Timer的使用及分析 1) 如何实现指定时间执行任务 2) 如何实现按指定周期执行任务 第五章 定时器Timer 定时/计划功能在移动开发领域使用 ...

  3. java 线程等待队列_Java多线程学习(五)——等待通知机制

    等待通知机制的实现 方法wait()的作用是使当前线程进行等待,wait()方法是Object类的方法,该方法用来将当前线程放到"预执行队列",并在wait()所在的代码处停止执行 ...

  4. 队列和通知区别_Java多线程学习(五)——等待通知机制

    等待通知机制的实现 方法wait()的作用是使当前线程进行等待,wait()方法是Object类的方法,该方法用来将当前线程放到"预执行队列",并在wait()所在的代码处停止执行 ...

  5. Java多线程学习十五:公平锁和非公平锁,为什么要“非公平”?

    什么是公平和非公平 公平锁 指的是按照线程请求的顺序,来分配锁: 非公平锁 指的是不完全按照请求的顺序,在一定情况下,可以允许插队.但需要注意这里的非公平并不是指完全的随机,不是说线程可以任意插队,而 ...

  6. ABP学习实践(五)--引入Swagger对API接口进行管理

    以目前流行的前后端分离模式来看,ABP框架更适用于后端开发,而对API接口的管理就成了一项必不可少的功能. 1.安装Swashbuckle.AspNetCore 使用Nuget管理器在分布式服务层和展 ...

  7. 艾伟:C#多线程学习(六) 互斥对象

    本系列文章导航 C#多线程学习(一) 多线程的相关概念 C#多线程学习(二) 如何操纵一个线程 C#多线程学习(三) 生产者和消费者 C#多线程学习(四) 多线程的自动管理(线程池) C#多线程学习( ...

  8. C#多线程学习(二) 如何操纵一个线程

    C#多线程学习(二) 如何操纵一个线程 原文链接:http://kb.cnblogs.com/page/42529/ [1] C#多线程学习(二) 如何操纵一个线程 [2] C#多线程学习(二) 如何 ...

  9. C#多线程学习(三) 生产者和消费者

    C#多线程学习(三) 生产者和消费者 原文链接:http://kb.cnblogs.com/page/42530/ 本系列文章导航 C#多线程学习(一) 多线程的相关概念 C#多线程学习(二) 如何操 ...

最新文章

  1. 简单介绍MySQL开启事务的两种方式
  2. Android 获取keystore SHA1方法
  3. 从零开始学习docker(十九)Swarm mode 集群服务间通信--RoutingMesh
  4. C51_按键按下,流水灯亮起,数码管显示按下的次数
  5. 【转】我们今年二十三四岁。。。
  6. 非极大值抑制(NMS)
  7. 赛锐信息:SAP ABAP 常量和字面量
  8. 二级Access数据库大纲知识要点
  9. java 四舍五入保留小数
  10. 用傅里叶变换求单位原点的格林函数
  11. 汇编语言指令用法大全
  12. python_while 循环_珠穆朗玛峰
  13. MapReduce论文解读
  14. 数据网格(Data Mesh)是什么?
  15. 跟着Cell学作图 | 12.韦恩图(Vennerable包)
  16. vue中使用天地图测距、测面、标点【一】
  17. RESTful介绍(应用场合、常见的注解)
  18. 刚刚!安森美上海全球配送中心被迫关闭,将转移至新加坡和马尼拉
  19. 加密恶意流量检测思路分析
  20. 最新麦子学院Web前端项目实战 Web前端开发从入门到精通33G完整版

热门文章

  1. Android的服务(Service)(三)Service客户端的绑定与跨进程
  2. 浏览器获取文件MD5值
  3. 树莓派linux系统识别u盘启动,树莓派Raspberry Pi实战之命令行下实现USB存储设备自动挂载...
  4. JZOJ 5625. 【NOI2018模拟4.3】Max
  5. JZOJ 5448. 【NOIP2017提高A组冲刺11.3】机房比教室好多了
  6. myelicesp stepover不能点_市区6处垃圾临时转运点被撤销
  7. ps抠头发插件_「福利」PS抠图神级插件——VertusFluid Mask
  8. LOJ #2734 Luogu P3615 [JOI2016春季合宿]Toilets (结论、贪心)
  9. 涂格子游戏html,网页版方格贪吃蛇游戏html源码分享
  10. html 桌面截图,如何使用javascript在html中截取屏幕截图?