程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> ThreadPool 線程池[c#]

ThreadPool 線程池[c#]

編輯:.NET實例教程

//ThreadPool(線程池)是一個靜態類,它沒有定義任何的構造方法(),我們只能夠使用它的靜態方法,這是因為,這是因為ThreadPool是托管線程池,是由CLR管理的。
//ThreadPool使用WaitCallback委托,它所要做的工作是在後台進行的。使工作項的排隊和運行更容易,可以給工作者線程傳遞一個狀態對象(提供數據)。狀態對象是私有的作用域位於線程層,所以不需要進行同步。
//ThreadPool目標是為了減除線程的初始化開銷,實現並行處理。.NET類庫中的ThreadPool是異步IO的基礎,比如,在System.Net.Socket中,我們可以使用BeginAccept , EndAccept將Socket需要阻塞的操作放到系統的線程池中運行,而在執行結束以後通知主線程。

//一個ThreadPool裡面注冊的線程擁有默認的堆棧大小,默認的優先級。並且,他們都存在於多線程空間(Multithreaded apartment)中。

//ThreadPool中的Thread不能手動取消,也不用手動開始。所以ThreadPool並不適用比較長的線程。你要做的只是把一個WaitCallback委托塞給ThreadPool,然後剩下的工作將由系統自動完成。系統會在ThreadPool的線程隊列中一一啟動線程。

//當線程池滿時,多余的線程會在隊列裡排隊,當線程池空閒時,系統自動掉入排隊的線程,以保持系統利用率。

//我們的程序中使用ThreadPool來進行一些比較耗時或者需要阻塞的操作。當學要復雜的同步技術,例如事件,或需要對一個現場表調用Join方法時線程池就不能滿足需求了.在以下情況中不宜使用ThreadPool而應該使用單獨的Thread:
//1,需要為線程指定詳細的優先級
//2,線程執行需要很長時間
//3,需要把線程放在單獨的線程apartment中
//4,在線程執行中需要對線程操作,如打斷,掛起等。


//通常是將計算密集型的操作放在worker線程池中運行,而線程池的大小會根據當前的CPU使用量自動調整,通過下面兩個方法,我們可以設置線程池的大小:
//ThreadPool.SetMaxThreads(10, 200);
//ThreadPool.SetMinThreads(2, 40);
//兩個參數分別是WorkThread和IO thread的限制。

先看一個簡單的例子(運行結果不會每次都一樣,這應該是ThreadPool後台處理的正常反應)

 



using System;
using System.Threading;
using System.Collections.Generic;
using System.Text;

namespace ThreadPoolDemo
{
    class Program
    {        
        static void Main(string[] args)
        {
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved