C#多線程
一、基本概念
1、進程
首先打開任務管理器,查看當前運行的進程:

從任務管理器里面可以看到當前所有正在運行的進程。那么究竟什么是進程呢?
進程(Process)是Windows系統(tǒng)中的一個基本概念,它包含著一個運行程序所需要的資源。一個正在運行的應用程序在操作系統(tǒng)中被視為一個進程,進程可以包括一個或多個線程。線程是操作系統(tǒng)分配處理器時間的基本單元,在進程中可以有多個線程同時執(zhí)行代碼。進程之間是相對獨立的,一個進程無法訪問另一個進程的數(shù)據(jù)(除非利用分布式計算方式),一個進程運行的失敗也不會影響其他進程的運行,Windows系統(tǒng)就是利用進程把工作劃分為多個獨立的區(qū)域的。進程可以理解為一個程序的基本邊界。是應用程序的一個運行例程,是應用程序的一次動態(tài)執(zhí)行過程。
二、線程
在任務管理器里面查詢當前總共運行的線程數(shù):

線程(Thread)是進程中的基本執(zhí)行單元,是操作系統(tǒng)分配CPU時間的基本單位,一個進程可以包含若干個線程,在進程入口執(zhí)行的第一個線程被視為這個進程的主線程。在.NET應用程序中,都是以Main()方法作為入口的,當調(diào)用此方法時系統(tǒng)就會自動創(chuàng)建一個主線程。線程主要是由CPU寄存器、調(diào)用棧和線程本地存儲器(Thread Local Storage,TLS)組成的。CPU寄存器主要記錄當前所執(zhí)行線程的狀態(tài),調(diào)用棧主要用于維護線程所調(diào)用到的內(nèi)存與數(shù)據(jù),TLS主要用于存放線程的狀態(tài)信息。
二、多線程
多線程的優(yōu)點:可以同時完成多個任務;可以使程序的響應速度更快;可以讓占用大量處理時間的任務或當前沒有進行處理的任務定期將處理時間讓給別的任務;可以隨時停止任務;可以設置每個任務的優(yōu)先級以優(yōu)化程序性能。
那么可能有人會問:為什么可以多線程執(zhí)行呢?總結(jié)起來有下面兩方面的原因:
1、CPU運行速度太快,硬件處理速度跟不上,所以操作系統(tǒng)進行分時間片管理。這樣,從宏觀角度來說是多線程并發(fā)的,因為CPU速度太快,察覺不到,看起來是同一時刻執(zhí)行了不同的操作。但是從微觀角度來講,同一時刻只能有一個線程在處理。
2、目前電腦都是多核多CPU的,一個CPU在同一時刻只能運行一個線程,但是多個CPU在同一時刻就可以運行多個線程。
然而,多線程雖然有很多優(yōu)點,但是也必須認識到多線程可能存在影響系統(tǒng)性能的不利方面,才能正確使用線程。不利方面主要有如下幾點:
(1)線程也是程序,所以線程需要占用內(nèi)存,線程越多,占用內(nèi)存也越多。
(2)多線程需要協(xié)調(diào)和管理,所以需要占用CPU時間以便跟蹤線程。
(3)線程之間對共享資源的訪問會相互影響,必須解決爭用共享資源的問題。
(4)線程太多會導致控制太復雜,最終可能造成很多程序缺陷。
當啟動一個可執(zhí)行程序時,將創(chuàng)建一個主線程。在默認的情況下,C#程序具有一個線程,此線程執(zhí)行程序中以Main方法開始和結(jié)束的代碼,Main()方法直接或間接執(zhí)行的每一個命令都有默認線程(主線程)執(zhí)行,當Main()方法返回時此線程也將終止。
一個進程可以創(chuàng)建一個或多個線程以執(zhí)行與該進程關聯(lián)的部分程序代碼。在C#中,線程是使用Thread類處理的,該類在System.Threading命名空間中。使用Thread類創(chuàng)建線程時,只需要提供線程入口,線程入口告訴程序讓這個線程做什么。通過實例化一個Thread類的對象就可以創(chuàng)建一個線程。創(chuàng)建新的Thread對象時,將創(chuàng)建新的托管線程。Thread類接收一個ThreadStart委托或ParameterizedThreadStart委托的構(gòu)造函數(shù),該委托包裝了調(diào)用Start方法時由新線程調(diào)用的方法,示例代碼如下:
Thread thread=new Thread(new ThreadStart(method));//創(chuàng)建線程
thread.Start();?????????????????????????????????????????????????????????? //啟動線程
上面代碼實例化了一個Thread對象,并指明將要調(diào)用的方法method(),然后啟動線程。ThreadStart委托中作為參數(shù)的方法不需要參數(shù),并且沒有返回值。ParameterizedThreadStart委托一個對象作為參數(shù),利用這個參數(shù)可以很方便地向線程傳遞參數(shù),示例代碼如下:
Thread thread=new Thread(new ParameterizedThreadStart(method));//創(chuàng)建線程
thread.Start(3);???????????????????????????????????????????????????????????????????????????? //啟動線程
創(chuàng)建多線程的步驟:
1、編寫線程所要執(zhí)行的方法
2、實例化Thread類,并傳入一個指向線程所要執(zhí)行方法的委托。(這時線程已經(jīng)產(chǎn)生,但還沒有運行)
3、調(diào)用Thread實例的Start方法,標記該線程可以被CPU執(zhí)行了,但具體執(zhí)行時間由CPU決定
2.1 System.Threading.Thread類
Thread類是是控制線程的基礎類,位于System.Threading命名空間下,具有4個重載的構(gòu)造函數(shù):

ThreadStart是一個無參的、返回值為void的委托。委托定義如下:
public delegate void ThreadStart()
通過ThreadStart委托創(chuàng)建并運行一個線程:

運行結(jié)果

除了可以運行靜態(tài)的方法,還可以運行實例方法

運行結(jié)果:

如果為了簡單,也可以通過匿名委托或Lambda表達式來為Thread的構(gòu)造方法賦值

?運行結(jié)果:

ParameterizedThreadStart是一個有參的、返回值為void的委托,定義如下:
public delegate void ParameterizedThreadStart(Object obj)

注意:ParameterizedThreadStart委托的參數(shù)類型必須是Object的。如果使用的是不帶參數(shù)的委托,不能使用帶參數(shù)的Start方法運行線程,否則系統(tǒng)會拋出異常。但使用帶參數(shù)的委托,可以使用thread.Start()來運行線程,這時所傳遞的參數(shù)值為null。


本文轉(zhuǎn)載自博客園:https://www.cnblogs.com/dotnet261010/p/6159984.html
C