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

        }
    }
}
相關文章
相關標籤/搜索