最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#線程池用法詳細(xì)介紹

 更新時間:2013年11月04日 15:09:45   作者:  
在C#編程語言中,使用線程池可以并行地處理工作,當(dāng)強制線程和更新進(jìn)度條時,會使用內(nèi)建架構(gòu)的ThreadPool類,為批處理使用多核結(jié)構(gòu),這里我們來看在C#編程語言中一些關(guān)于來自System.Threading的ThreadPool的用法的例子

介紹

.NET Framework提供了包含ThreadPool類的System.Threading 空間,這是一個可直接訪問的靜態(tài)類,該類對線程池是必不可少的。它是公共“線程池”設(shè)計樣式的實現(xiàn)。對于后臺運行許多各不相同的任務(wù)是有用的。對于單個的后臺線種而言有更好的選項。

線程的最大數(shù)量。這是完全無須知道的。在.NET中ThreadPool的所有要點是它自己在內(nèi)部管理線程池中線程。多核機器將比以往的機器有更多的線程。微軟如此陳述“線程池通常有一個線程的最大數(shù)量,如果所有的線程都忙,增加的任務(wù)被放置在隊列中直到它們能被服務(wù),才能作為可用的線程?!?/P>

用法位置

線程池類型能被用于服務(wù)器和批處理應(yīng)用程序中,線程池有更廉價的得到線程的內(nèi)部邏輯,因為當(dāng)需要時這些線程已被形成和剛好“連接”,所以線程池風(fēng)格代碼被用在服務(wù)器上。

MSDN表述:“線程池經(jīng)常用在服務(wù)器應(yīng)用程序中,每一個新進(jìn)來的需求被分配給一個線程池中的線程,這樣該需求能被異步的執(zhí)行,沒有阻礙主線程或推遲后繼需求的處理?!?/P>

MSDN 參考

ThreadPool  VS  BackgroundWorker

如果你正在使用Windows窗體,寧可使用BackgroundWorker來對付那些更簡單的線程需求,BackgroundWorker在網(wǎng)絡(luò)訪問和其他一些簡單的事情方面做得很好。但對于多處理器的批處理來說,你需要ThreadPool。

BackgroundWorker 教程

當(dāng)你的程序要批處理時,考慮線程池

當(dāng)你的程序產(chǎn)生很多(3個以上)線程時,考慮線程池

當(dāng)你的程序使用Windows窗體時,考慮后臺執(zhí)行。

線程要考慮的事 同樣,如何使用線程的細(xì)節(jié)能幫助發(fā)現(xiàn)最好的代碼。下面比較線程情形和哪個類是最好的。

   你需要一個額外的線程   使用后臺執(zhí)行

   你有許多短期的線程     使用線程池

需求

線程很重要,但對于那些不會花很長時間來執(zhí)行且只做一件事情的大多數(shù)應(yīng)用程序來說卻并不重要的。線程對于界面可用性不是很重要的的應(yīng)用程序而言也不是很重要,要盡量避免使用線程(譯者注:比如進(jìn)度條不是很重要的應(yīng)用程序)。

連接方法

可使用QueueUserWorkItem連接方法(methods)到線程池。方法要運行在線程上,則必須把它連接到QueueUserWorkItem。如何實現(xiàn)呢?必須使用WaitCallback。在MSDN中,WaitCallback被描述成當(dāng)線程池執(zhí)行時要被調(diào)用的委托回調(diào)方法,是回調(diào)它的參數(shù)的委托。

WaitCallback

只需指定“new WaitCallback”語句作為ThreadPool.QueueUserWorkItem的第一個參數(shù)來使用WaitCallback.不需要任何其他的代碼來使用這方法生效。

使用WaitCallback[c#]的例子

復(fù)制代碼 代碼如下:

void Example() 



    // 連接 ProcessFile 方法到線程池.  

    //注意: 'a' 是一個作為參數(shù)的對象  

    ThreadPool.QueueUserWorkItem(new WaitCallback(ProcessFile), a); 



private void ProcessFile(object a) 



    // 我被連接到線程池通過 WaitCallback.  

參數(shù)

我們能通過定義一個特定的類并把一些重要的值放在類里面來使用參數(shù),那么,方法接收了對象,就能通過對象向方法傳遞多個參數(shù)了。以下是一個早期的例子。

使用帶參數(shù)QueueUserWorkItem 的例子[c#]

復(fù)制代碼 代碼如下:

//指定作為線程池方法的參數(shù)的類  

class ThreadInfo 



    public string FileName { get; set; } 

    public int SelectedIndex { get; set; } 



class Example 



    public Example() 

    { 

// 聲明一個新的參數(shù)對象  

ThreadInfo threadInfo = new ThreadInfo(); 

threadInfo.FileName = "file.txt"; 

threadInfo.SelectedIndex = 3; 

//發(fā)送自定義的對象到線程方法  

ThreadPool.QueueUserWorkItem(new WaitCallback(ProcessFile), threadInfo); 

    } 

    private void ProcessFile(object a) 

    { 

ThreadInfo threadInfo = a as ThreadInfo; 

string fileName = threadInfo.FileName; 

int index = thread.SelectedIndex; 

    } 

發(fā)生了什么事?我們發(fā)送兩個值給這個線程化的ProcessFile方法,它需要知道文件名和選擇索引,而我們在這個對象中把參數(shù)都發(fā)送了給它。

進(jìn)度條

能通過從設(shè)計器中右邊的工具盒面板中增加Windows窗體控件到你的窗體程序來使用進(jìn)度條并設(shè)置 progressBar1.Value, progressBar1.Minimum 和progressBar1.Maximum。 progressBar1.Value是最小值和最大值中間的位置,以下代碼用來初始化進(jìn)度條:

設(shè)置進(jìn)度條的例子 [C#]

復(fù)制代碼 代碼如下:

//設(shè)置進(jìn)度條的長度.  

// 這里我們有6個單位來完成,所以6是最大值。  

// 最小值通常是0  

progressBar1.Maximum = 6; // 或其他數(shù)字  

progressBar1.Minimum = 0; 

進(jìn)度條位置 你的進(jìn)度條中的有顏色部分是當(dāng)前值與最大值的百分比。所以,如果最大值是6,而值是3即表示做完了一半。

ProgressBar 例子 (Windows Forms)

在進(jìn)度條中調(diào)用Invoke(援引)

讓我們看如何在進(jìn)度條實例中使用Invoke方法。遺憾的是,你不能在輔助線程中訪問Windows控件,因為UI線程是分離的,必須使用委托(delegate)和Invoke到進(jìn)度條。

請求Invoke(調(diào)用)的例子[C#]

復(fù)制代碼 代碼如下:

public partial class MainWindow : Form 



// 這是運行在UI線程來更新條的委托  

 public delegate void BarDelegate(); 

//該窗體的構(gòu)造器(由Visual Studio自己產(chǎn)生)  

    public MainWindow() 

    { 

InitializeComponent(); 

    } 

//當(dāng)按下按鈕,啟動一個新的線程  

    private void button_Click(object sender, EventArgs e) 

    { 

// 設(shè)定進(jìn)度條的長度.  

progressBar1.Maximum = 6; 

progressBar1.Minimum = 0; 

// 給線程傳遞這些值.  

ThreadInfo threadInfo = new ThreadInfo(); 

threadInfo.FileName = "file.txt"; 

threadInfo.SelectedIndex = 3; 

ThreadPool.QueueUserWorkItem(new WaitCallback(ProcessFile), threadInfo); 

    } 

// 運行在后臺線程上的東西  

 private void ProcessFile(object a) 

    { 

// (省略)  

// 使用'a'做一些重要的事.  

// 告訴UI 我們已經(jīng)完成了.  

try 



    // 在窗體中調(diào)用委托 .  

    this.Invoke(new BarDelegate(UpdateBar)); 



catch 



           //當(dāng)一些問題發(fā)生后我們能使程序恢復(fù)正常  



    } 

    //更新進(jìn)度條.  

    private void UpdateBar()  

    { 

progressBar1.Value++; 

if (progressBar1.Value == progressBar1.Maximum) 



    // 結(jié)束了,進(jìn)度條滿了.  



    } 

委托語法 以上代碼的開始處,可以看到聲明 UpdateBar 的委托。它告訴Visual Studio 和C# 需要來使用這個作為對象的方法。

更多需要的工作 以上程序演示了如何設(shè)定進(jìn)度條的最大值和最小值,如何在工作完成后“Invoke”委托方法來增加進(jìn)度條的大小。

在調(diào)試器中的線程

 這兒要顯示如何在Visual Studio的調(diào)試器中查看線程。一旦你有一個運行的程序,你能采取這些措施來可視化你的線程。首先,以調(diào)試模式打開你的線程應(yīng)用程序,一旦你的應(yīng)用程序運行在調(diào)試器,告知它去做它的工作而且運行這些線程,通過綠色箭頭運行調(diào)試器,當(dāng)線程正在運行,在工具條中單擊“pause"按鈕。

下一步 調(diào)試>窗口>線程.該菜單項將打開一個類似下圖的窗口,你能看見有多少線程正在線程池中運行。

四個輔助線程 上圖顯示了共有10個線程,但只有四個輔助線程(Worker Thread)在程序中被分配給MainWindow.ProcessFile.

約束輔助線程

如果你有一個雙核或四核系統(tǒng),你將考慮最多兩個四個很費力的線程。我們能在運行的線程中保持一個_threadCount 字段并且跟蹤它的數(shù)值。用這個線程計數(shù)字段,你將需要在C#語言中使用一個鎖來避免造成這個字段讀和寫的錯誤,鎖保護(hù)你的線程被其他線程所改變。

計數(shù)線程的例子 [C#]

復(fù)制代碼 代碼如下:

// 鎖住這個對象.  

readonly object _countLock = new object(); 

private void ProcessFile(object argument) 



// 約束輔助線程的數(shù)量  

while (true) 

    { 

lock (_countLock) 



    if (_threadCount < 4) 

    { 

// Start the processing  

_threadCount++; 

break; 

    } 



Thread.Sleep(50); 

    } 

    // Do work...  

我們看到什么 以是代碼是異步執(zhí)行的方法。只有其他輔助線程少于4個時它才會工作。這對于一個四核機器是好的。請看描述鎖聲明的更多上下文的文章

Lock Statement

控制線程計數(shù)器

你可以在ThreadPool上使用SetMinThreads 來在連發(fā)活動中提高吞吐量和性能。以下是關(guān)于可使用的最佳的最小線程數(shù)量的材料。

ThreadPool.SetMinThreads Method

總結(jié)

我們了解了如何在C#程序中使用線程池來有效管理多個線程,在Windows 窗體應(yīng)用程序的進(jìn)度條和用戶界面中能給人留很深印象并且也不難實現(xiàn)。然而,線程帶來了很多的復(fù)雜性并導(dǎo)致漏洞,線程池是一個有用的簡化,但它仍然是困難的。

相關(guān)文章

  • WinForm遍歷窗體所有子控件的方法

    WinForm遍歷窗體所有子控件的方法

    這篇文章主要介紹了WinForm遍歷窗體所有子控件的方法,涉及C#遞歸遍歷相關(guān)操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2016-07-07
  • C#解決“因為算法不同,客戶端和服務(wù)器無法通信”的問題

    C#解決“因為算法不同,客戶端和服務(wù)器無法通信”的問題

    實現(xiàn)微信退款功能,我們需要在微信支付商戶后臺申請安全證書,并調(diào)用退款A(yù)PI URL,在調(diào)試過程中為增添返回調(diào)試信息屬性,調(diào)試一切正常,但再次覆蓋的時候,調(diào)用顯示為 “ 因為算法不同,客戶端和服務(wù)器無法通信,” ,本文介紹了C#解決因為算法不同,客戶端和服務(wù)器無法通信的問題
    2024-12-12
  • 基于WebRequest.RegisterPrefix的使用詳解

    基于WebRequest.RegisterPrefix的使用詳解

    本篇文章對WebRequest.RegisterPrefix的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C# Winform中如何繪制動畫示例詳解

    C# Winform中如何繪制動畫示例詳解

    這篇文章主要給大家介紹了關(guān)于C# Winform中如何繪制動畫的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用C# Winform具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • C#之set與get方法的用法案例

    C#之set與get方法的用法案例

    這篇文章主要介紹了C#之set與get方法的用法案例,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C#定時器組件FluentScheduler用法

    C#定時器組件FluentScheduler用法

    這篇文章介紹了C#定時器插件FluentScheduler的用法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • C# 獲取當(dāng)前月份天數(shù)的三種方法總結(jié)

    C# 獲取當(dāng)前月份天數(shù)的三種方法總結(jié)

    本篇文章主要是對C#中獲取目前月份的天數(shù)的三種方法進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2014-01-01
  • C#圓形頭像框制作并從數(shù)據(jù)庫讀取

    C#圓形頭像框制作并從數(shù)據(jù)庫讀取

    本文主要介紹了C#圓形頭像框制作并從數(shù)據(jù)庫讀取,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • dotnet core鏈接mongodb代碼實例

    dotnet core鏈接mongodb代碼實例

    這篇文章主要介紹了dotnet core鏈接mongodb代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • C#修改MAC地址類的實例

    C#修改MAC地址類的實例

    C#修改MAC地址類的實例,需要的朋友可以參考一下
    2013-03-03

最新評論

增城市| 武乡县| 定襄县| 千阳县| 镇赉县| 云和县| 峡江县| 吉木萨尔县| 仙游县| 连州市| 莲花县| 周口市| 舒城县| 武宁县| 舒兰市| 怀仁县| 灵台县| 古蔺县| 石首市| 无锡市| 石河子市| 金沙县| 永新县| 巴林左旗| 嘉黎县| 讷河市| 措美县| 汾阳市| 广安市| 邵阳市| 长阳| 梅州市| 宜兴市| 宜宾市| 新巴尔虎右旗| 五台县| 伊川县| 迭部县| 乌拉特后旗| 西宁市| 历史|