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

        }
    }
}
相关文章
相关标签/搜索