亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#線程池用法詳細介紹

2020-01-24 03:05:22
字體:
來源:轉載
供稿:網友

介紹

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

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

用法位置

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

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

MSDN 參考

ThreadPool  VS  BackgroundWorker

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

BackgroundWorker 教程

當你的程序要批處理時,考慮線程池

當你的程序產生很多(3個以上)線程時,考慮線程池

當你的程序使用Windows窗體時,考慮后臺執行。

線程要考慮的事 同樣,如何使用線程的細節能幫助發現最好的代碼。下面比較線程情形和哪個類是最好的。

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

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

需求

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

連接方法

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

WaitCallback

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

使用WaitCallback[c#]的例子

復制代碼 代碼如下:

void Example() 



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

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

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



private void ProcessFile(object a) 



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

參數

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

使用帶參數QueueUserWorkItem 的例子[c#]

復制代碼 代碼如下:

//指定作為線程池方法的參數的類  

class ThreadInfo 



    public string FileName { get; set; } 

    public int SelectedIndex { get; set; } 



class Example 



    public Example() 

    { 

// 聲明一個新的參數對象  

ThreadInfo threadInfo = new ThreadInfo(); 

threadInfo.FileName = "file.txt"; 

threadInfo.SelectedIndex = 3; 

//發送自定義的對象到線程方法  

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

    } 

    private void ProcessFile(object a) 

    { 

ThreadInfo threadInfo = a as ThreadInfo; 

string fileName = threadInfo.FileName; 

int index = thread.SelectedIndex; 

    } 

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

進度條

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

設置進度條的例子 [C#]

復制代碼 代碼如下:

//設置進度條的長度.  

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

// 最小值通常是0  

progressBar1.Maximum = 6; // 或其他數字  

progressBar1.Minimum = 0; 

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

ProgressBar 例子 (Windows Forms)

在進度條中調用Invoke(援引)

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

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

復制代碼 代碼如下:

public partial class MainWindow : Form 



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

 public delegate void BarDelegate(); 

//該窗體的構造器(由Visual Studio自己產生)  

    public MainWindow() 

    { 

InitializeComponent(); 

    } 

//當按下按鈕,啟動一個新的線程  

    private void button_Click(object sender, EventArgs e) 

    { 

// 設定進度條的長度.  

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 我們已經完成了.  

try 



    // 在窗體中調用委托 .  

    this.Invoke(new BarDelegate(UpdateBar)); 



catch 



           //當一些問題發生后我們能使程序恢復正常  



    } 

    //更新進度條.  

    private void UpdateBar()  

    { 

progressBar1.Value++; 

if (progressBar1.Value == progressBar1.Maximum) 



    // 結束了,進度條滿了.  



    } 

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

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

在調試器中的線程

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

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

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

約束輔助線程

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

計數線程的例子 [C#]

復制代碼 代碼如下:

// 鎖住這個對象.  

readonly object _countLock = new object(); 

private void ProcessFile(object argument) 



// 約束輔助線程的數量  

while (true) 

    { 

lock (_countLock) 



    if (_threadCount < 4) 

    { 

// Start the processing  

_threadCount++; 

break; 

    } 



Thread.Sleep(50); 

    } 

    // Do work...  

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

Lock Statement

控制線程計數器

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

ThreadPool.SetMinThreads Method

總結

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩欧美精品中文字幕| 亚洲精品美女网站| 国产精品久久久久久av下载红粉| 欧美电影在线播放| 综合国产在线视频| 亚洲a级在线播放观看| 久久天天躁狠狠躁夜夜躁| 91香蕉嫩草神马影院在线观看| 欧美日韩国产999| 久久精品国产96久久久香蕉| 91高潮精品免费porn| 中文字幕在线看视频国产欧美| 插插插亚洲综合网| 中文字幕精品国产| 国产日韩中文在线| 亚洲成人精品在线| 亚洲美女又黄又爽在线观看| 欧美激情一区二区三级高清视频| 久久夜色精品国产欧美乱| 国产免费观看久久黄| 日韩在线欧美在线| 国语自产精品视频在免费| 久久久久久成人精品| 国产日韩精品视频| 7777免费精品视频| 美日韩精品免费视频| 精品久久久久久久久久久| 国产精品久久久久av| 91精品国产网站| 国产精品夜色7777狼人| 欧洲成人在线观看| 大桥未久av一区二区三区| 青青青国产精品一区二区| 国外成人在线直播| 中文字幕精品一区二区精品| 国产成人高清激情视频在线观看| 欧美xxxx综合视频| 亚洲国产91精品在线观看| 91久久在线播放| 亚洲最新视频在线| 欧美精品福利在线| 国产91精品久久久久| 欧美有码在线观看视频| 91亚洲va在线va天堂va国| 欧美日韩国产中文精品字幕自在自线| 亚洲黄页视频免费观看| 国产美女久久精品| 久久精品国产视频| 在线视频日本亚洲性| 久久精品电影网| 日韩欧美在线一区| 麻豆国产va免费精品高清在线| 久久伊人91精品综合网站| 国自在线精品视频| 亚洲欧美精品suv| 亚洲国产成人91精品| 欧美一级片免费在线| 亚洲人成伊人成综合网久久久| 亚洲国产精品久久| 国产精品观看在线亚洲人成网| 美日韩精品免费视频| 日韩美女激情视频| 久久久午夜视频| 亚洲男人天堂2023| 国产69精品久久久| 亚洲aaa激情| 国产日本欧美一区二区三区| 国产极品精品在线观看| 欧美一级免费视频| 91久久在线播放| 中文字幕在线日韩| 性欧美长视频免费观看不卡| 国产日韩欧美影视| 亚洲综合日韩中文字幕v在线| 51ⅴ精品国产91久久久久久| 亚洲欧美一区二区三区久久| 亚洲精品电影网| 色一区av在线| 国产欧美久久久久久| 国产欧美精品一区二区三区介绍| 亚洲第一中文字幕| 欧美大片在线影院| 国产99久久精品一区二区 夜夜躁日日躁| 日韩欧美在线视频日韩欧美在线视频| 欧美色欧美亚洲高清在线视频| 26uuu另类亚洲欧美日本一| 中文字幕v亚洲ⅴv天堂| 午夜精品久久久久久久99热浪潮| 亚洲激情中文字幕| 色黄久久久久久| 欧美中文字幕视频在线观看| 亚洲精品中文字幕女同| 国产精品青草久久久久福利99| 岛国视频午夜一区免费在线观看| 国产91ⅴ在线精品免费观看| 久久人人爽人人爽爽久久| 欧美激情高清视频| 欧美xxxx做受欧美| 久久久亚洲影院你懂的| 国模叶桐国产精品一区| 欧美亚洲日本网站| 91成人性视频| 国产精品一久久香蕉国产线看观看| 91久久久久久久久久| 日韩欧美aaa| 亚洲精品大尺度| 亚洲欧美日韩网| 国产精品久久久久高潮| 国产精品jizz在线观看麻豆| 欧美黑人又粗大| 精品av在线播放| 亚洲第一中文字幕在线观看| 成人中文字幕在线观看| 欧美黑人性视频| 国产精品成人观看视频国产奇米| 富二代精品短视频| 搡老女人一区二区三区视频tv| 亚洲欧美综合精品久久成人| 久久久久久成人| 欧美成年人视频网站欧美| 久久久久日韩精品久久久男男| 亚洲精品成人网| 中文字幕亚洲欧美日韩在线不卡| 国产精品wwwwww| 欧美日韩国产成人| 成人国产精品久久久久久亚洲| 精品国产网站地址| 在线视频精品一| 亚洲午夜国产成人av电影男同| 日韩精品一区二区视频| 在线视频欧美日韩精品| 国产精品久久激情| 成人欧美在线视频| 中国人与牲禽动交精品| 国产精品青草久久久久福利99| 亚洲成人1234| 久久久中精品2020中文| 日韩麻豆第一页| 久久人人爽人人爽人人片av高清| 亚洲男人的天堂在线播放| 琪琪亚洲精品午夜在线| 亚洲人成毛片在线播放| 欧美极品在线视频| 亚洲第一男人天堂| 久久免费高清视频| 欧美激情视频在线免费观看 欧美视频免费一| 92看片淫黄大片看国产片| 国产精品久久久久高潮| 亚洲午夜性刺激影院| 久久琪琪电影院| 欧美激情精品久久久久久黑人| 亚洲国产精品yw在线观看| 亚洲激情成人网| 激情懂色av一区av二区av| 成人久久久久久| 永久免费看mv网站入口亚洲| 国产精品久久久久999| 国产精品国产亚洲伊人久久| 精品夜色国产国偷在线| 欧美精品在线第一页| 国产精品久久久久久久电影| 国产免费一区二区三区在线能观看| 正在播放国产一区| 欧美激情亚洲激情|