C# 多线程之通过Timer开启线程的例子
2024-10-08 05:38:40
本例通过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, ,); //把这个委托作为参数传递进去,timer开启后tick延迟3秒, 之后每2秒执行一次tick()事件,而此事件就会触发TimerCallback委托。一下就要新建一个线程 int j = ;
while (j <)
{
Console.WriteLine("主线程正在执行********************* 线程ID" + Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(); //主线程休眠不会影响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();//模拟线程执行 需要10秒时间 。Timeout.Infinite无限长
Console.WriteLine("执行完成,线程ID" + Thread.CurrentThread.ManagedThreadId); }
}
}
最新文章
- gdb调试汇编堆栈过程的学习
- OpenCV从入门到放弃系列之——如何扫描图像、利用查找表和计时
- github仓库的克隆、修改、上传方法(图)
- EasyUI Jquery 动态加载树,点击节点加载
- 杭电 1595 find the safest road
- STL中vector的用法
- 构建移动Web应用程序的技术堆栈
- 《shell下sort排序命令的使用》
- WIN7右下角的声音图标不见了
- LoadRunner测试问题
- 纯css实现三角形
- slide from one widget to another
- Android开发(21)--有关Spinner控件的使用说明
- 关于MongoDB安全事件的一些思考
- adb命令安装apk 来学习吧
- Elasticsearch 的分页报错 result window is too large
- 求最小生成树——Kruskal算法
- JavaScript 函数式编程读书笔记2
- 修改 this 指向
- 解析:SO_REUSEADDR bind: address in use
热门文章
- 异数OS-星星之火(二)--远程实验室注册开放
- QTP测试web时:打开ie浏览器进行录制但qtp录制脚本为空
- Educational Codeforces Round 80 (Rated for Div. 2) E. Messenger Simulator
- 《代码整洁之道》&;《程序员的职业素养》
- UML类图的情话诉说
- 终于知道为什么linux文件系统权限是124了
- 解决AS加载gradle时出现的Could not find com.android.tools.build:gradle:3.5.0.的错误
- 制作ASCII字符动画
- 把";重试";抽象出来做个工具类吧
- Webpack 一,打包JS