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

        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM