引言
本文主要從線程的基礎用法,CLR線程池當中工作者線程與I/O線程的開發,并行操作PLINQ等多個方面介紹多線程的開發。
其中委托的BeginInvoke方法以及回調函數最為常用。
而 I/O線程可能容易遭到大家的忽略,其實在開發多線程系統,更應該多留意I/O線程的操作。特别是在ASP.NET開發當中,可能更多人隻會留意在用戶端 使用Ajax或者在伺服器端使用UpdatePanel。其實合理使用I/O線程在通訊項目或檔案下載下傳時,能盡可能地減少IIS的壓力。
并行程式設計是Framework4.0中極力推廣的異步操作方式,更值得更深入地學習。
希望本篇文章能對各位的學習研究有所幫助,當中有所錯漏的地方敬請點評。
目錄
<a target="_blank" href="http://blog.51cto.com/2689556/835785">一、線程的定義</a>
<a href="http://blog.51cto.com/2689556/835794" target="_blank">二、線程的基礎知識</a>
<a target="_blank" href="http://blog.51cto.com/2689556/835815">三、以ThreadStart方式實作多線程</a>
<a target="_blank" href="http://blog.51cto.com/2689556/835832">四、CLR線程池的工作者線程</a>
<a target="_blank" href="http://blog.51cto.com/2689556/835851">五、CLR線程池的I/O線程</a>
<a target="_blank" href="http://blog.51cto.com/2689556/835861">六、異步 SqlCommand</a>
<a target="_blank" href="http://blog.51cto.com/2689556/835866">七、并行程式設計與PLINQ</a>
<a href="http://79100812.blog.51cto.com/2689556/835881" target="_blank">八、計時器與鎖</a>
一、線程的定義
1. 1 程序、應用程式域與線程的關系
程序(Process)是Windows系統中的一個基本概念,它包含着一個運作程式所需要的資源。程序之間是相對獨立的,一個程序無法通路另一個 程序的資料(除非利用分布式計算方式),一個程序運作的失敗也不會影響其他程序的運作,Windows系統就是利用程序把工作劃分為多個獨立的區域的。進 程可以了解為一個程式的基本邊界。
應用程式域(AppDomain)是一個程式運作的邏輯區域,它可以視為一個輕量級的程序,.NET的程式集正是在應用程式域中運作的,一個程序可 以包含有多個應用程式域,一個應用程式域也可以包含多個程式集。在一個應用程式域中包含了一個或多個上下文context,使用上下文CLR就能夠把某些 特殊對象的狀态放置在不同容器當中。
線程(Thread)是程序中的基本執行單元,在程序入口執行的第一個線程被視為這個程序的主線程。在.NET應用程式中,都是以Main()方法 作為入口的,當調用此方法時系統就會自動建立一個主線程。線程主要是由CPU寄存器、調用棧和線程本地存儲器(Thread Local Storage,TLS)組成的。CPU寄存器主要記錄目前所執行線程的狀态,調用棧主要用于維護線程所調用到的記憶體與資料,TLS主要用于存放線程的狀 态資訊。
程序、應用程式域、線程的關系如下圖,一個程序内可以包括多個應用程式域,也有包括多個線程,線程也可以穿梭于多個應用程式域當中。但在同一個時刻,線程隻會處于一個應用程式域内。
<a href="http://blog.51cto.com/attachment/201204/144838533.jpg" target="_blank"></a>
1.2 多線程
在單CPU系統的一個機關時間(time slice)内,CPU隻能運作單個線程,運作順序取決于線程的優先級别。如果在機關時間内線程未能完成執行,系統就會把線程的狀态資訊儲存到線程的本地 存儲器(TLS) 中,以便下次執行時恢複執行。而多線程隻是系統帶來的一個假像,它在多個機關時間内進行多個線程的切換。因為切換頻密而且機關時間非常短暫,是以多線程可 被視作同時運作。
适當使用多線程能提高系統的性能,比如:在系統請求大容量的資料時使用多線程,把資料輸出工作交給異步線程,使主線程保持其穩定性去處理其他問題。但需要注意一點,因為CPU需要花費不少的時間線上程的切換上,是以過多地使用多線程反而會導緻性能的下降。
本文轉自 leslies2 51CTO部落格,原文連結:http://blog.51cto.com/79100812/835785