-
C# 多线程之通过Timer开启线程的例子
本例通过Timer的tick()方法触发TimerCallback委托来开辟新的线程,线程中的具体工作通过一个静态方法作为参数给TimerCallback委托。
using System; using System.Threading; /* 这是一个关于 timer开启多线程的一个例子 * 1.Timer 的tick事件触发系统内置委托TimerCallback委托。而此委托会触发一个新的线程 。此线程中需要完成的具体的工作写成一个静态方法。作为参数传递给这个委托。 * 2.如果是用Timer触发的线程会自动开始不需要用到.Start()来启动 * 3.如果没有使用线程池threadpool 那么有多少个线程系统都会全部执行 这样的话如果线程太多那就使系统不停地在线程间切换会消耗大量时间。所以说线程太多时一定要 * 用一个线程池来管理 这样就可以提高效率 * 4.虽然timer是在主线程中创建并开始运行的, 但是主线程暂停却并不影响timer的tick事件的按时触发,比如本例中主线程设置睡眠5秒,但是并没有影响timer.tick事件触发 * 5.所有timer创建的线程都是后台线程 即 线程的.isbackground=true; * 6.用户不创建线程池 系统是不会自己创建的。 * 7.Timer.Change(Timeout.Infinite,Timeout.Infinite) 则是取消Timer的重复性劳动等待下次启用。 * 参数1:Timer每一次触发执行回调前需等待时间,0立即触发,Timeout.Infinite永不触发回调; * 参数2:表示每次触发timer的间隔时间,0表示只执行一次即第一次。 */ namespace TimerCreateThread { class Program { static void Main(string[] args) { Console.WriteLine("主线程开始执行********************* 线程ID" + Thread.CurrentThread.ManagedThreadId); TimerCallback delegate_tcb = new TimerCallback(ToDoSamething);//实例化一个可以创建新线程的内置委托--TimerCallback 。具体做的事写成一个静态方法作为参数传入委托。 Timer timer = new Timer(delegate_tcb, null, 3000,2000); //把这个委托作为参数传递进去,timer开启后tick延迟3秒, 之后每2秒执行一次tick()事件,而此事件就会触发TimerCallback委托。一下就要新建一个线程 int j = 0; while (j <3) { Console.WriteLine("主线程正在执行********************* 线程ID" + Thread.CurrentThread.ManagedThreadId); Thread.Sleep(4000); //主线程休眠不会影响tick执行 因为我设置的tick时间为2秒 ,而主线程要睡4秒 //证明 虽然timer是在主线程中进行的 但是 主线程暂停却并不影响timer的tick事件的按时触发 j++; } timer.Change(Timeout.Infinite, Timeout.Infinite);//完成上面的while循环后执行此句时钟停止。Timer就不再通过tick激发委托创建新线程 时间为4000*3=12秒。此时就不会触发新的线程 但已经触发的线程不会结束 。不管是否正在执行还是正在等待 //timer.Dispose();//不建议使用销毁。因为一旦销毁就不能再重启时间触发器 Console.WriteLine("线程池已满,不再开辟新的线程"); Console.ReadKey(); } //具体工作内容写入这个静态方法 static void ToDoSamething(object i) { Thread.CurrentThread.IsBackground = false; Console.WriteLine("此线程正在执行,线程ID" + Thread.CurrentThread.ManagedThreadId); Thread.Sleep(10000);//模拟线程执行 需要10秒时间 。Timeout.Infinite无限长 Console.WriteLine("执行完成,线程ID" + Thread.CurrentThread.ManagedThreadId); } } }
出处:https://www.cnblogs.com/arcticfish/p/12305999.html
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
关于JS定时器的整理
JS中使用Promise.all控制所有的异步请求都完
js中字符串的方法
import-local执行流程与node模块路径解析流程
检测数据类型的四种方法
js中数组的方法,32种方法
前端操作方法
数据类型
window.localStorage.setItem 和 localStorage.setIte
如何完美解决前端数字计算精度丢失与数