應用CLR的線程池


大家都知道這個線程的建立和銷毀都需要很大的性能開銷,當有比較多且不同的任務需要完成時,可以考慮使用線程池來管理這些線程。在以windows NT為內核的操作系統上每個進程都包含一個線程池,在線程池中存在許多可以被隨時使用的線程,當應用程序使用時,可以從線程池中直接取出一個已經存在的線程,當某個線程使用完成后,不會立即銷毀,而是放入線程池中等待下一次的使用。

在C#中,通過System .Threading.ThreadPool提供了以下的常用方法和說明。

方法名稱 說明
BindHandle 將操作系統句柄綁定到ThreadPool。
GetAvailableThreads 檢索由GetMaxThreads方法返回的最大線程數和當前活動線程數之間的差值。
GetMaxThreads 檢索同時處於活動狀態的線程池請求的數目,所有大於此數目的請求將保持排隊狀態,直到線程池線程變為可用。
GetMinThreads 檢索線程池在新請求預測中維護的空閑線程數。    
QueueUserWorkItem 將方法排入隊列以便執行,此方法在有線程池線程變得可用時執行。
RegisterWaitForSingleObject 注冊正在等待WaitHandle的委托。
SetMaxThreads 設置可以同時處於活動狀態的線程池的請求數目。所有大於此數目的請求將保持排隊狀態,直到線程池線程變得可用。
SetMinThreads 設置線程池在新請求預測中維護的空閑線程數。
UnsafeQueueUserWorkItem 注冊一個等待WaitHandle的委托。
UnRegisterWaitForSingleObject 將指定的委托排隊到線程池。

舉個例子:

 static void Main(string[] args)
        {
            int intWorkThreads;
            int intCompletionPortThreads;
            ThreadPool.GetMaxThreads(out intWorkThreads, out intCompletionPortThreads);
            Console.WriteLine("最大工作線程數:{0},最大I/O線程數:{1}",intWorkThreads,intCompletionPortThreads);
            //獲取最大線程數的信息。
            for (int i = 0; i < 3; i++)
            {
                ThreadPool.QueueUserWorkItem(TestThreadPool);//在線程池中申請使用線程。
            }
            Console.ReadLine();
        }
        static void TestThreadPool(object obj)
        {
            for (int i = 0; i < 3; i++)
            {
                //Thread.CurrentThread.ManagedThreadId獲取正在運行的線程的標識。
                Console.WriteLine("線程池中,正在運行的線程的唯一標識為{0}",Thread.CurrentThread.ManagedThreadId);
            }
            Thread.Sleep(100);
        }

線程池中運行的線程都是后台線程,就是線程池中的所有線程的IsBackground屬性都被設置為True,后台線程不會影響應用程序的結束,而前台的線程對應用程序的結束會有很大影響,因為應用程序的退出必須等待所有的前台線程結束。


免責聲明!

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



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