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

首頁 > 學院 > 開發設計 > 正文

C#綜合揭秘——細說多線程

2019-11-17 02:56:37
字體:
來源:轉載
供稿:網友
C#綜合揭秘——細說多線程

一、線程的定義

1. 1 進程、應用程序域與線程的關系

進程(PRocess)是Windows系統中的一個基本概念,它包含著一個運行程序所需要的資源。進程之間是相對獨立的,一個進程無法訪問另一個進程的數據(除非利用分布式計算方式),一個進程運行的失敗也不會影響其他進程的運行,Windows系統就是利用進程把工作劃分為多個獨立的區域的。進程可以理解為一個程序的基本邊界。

應用程序域(AppDomain)是一個程序運行的邏輯區域,它可以視為一個輕量級的進程,.NET的程序集正是在應用程序域中運行的,一個進程可以包含有多個應用程序域,一個應用程序域也可以包含多個程序集。在一個應用程序域中包含了一個或多個上下文context,使用上下文CLR就能夠把某些特殊對象的狀態放置在不同容器當中。

線程(Thread)是進程中的基本執行單元,在進程入口執行的第一個線程被視為這個進程的主線程。在.NET應用程序中,都是以Main()方法作為入口的,當調用此方法時系統就會自動創建一個主線程。線程主要是由CPU寄存器、調用棧和線程本地存儲器(Thread Local Storage,TLS)組成的。CPU寄存器主要記錄當前所執行線程的狀態,調用棧主要用于維護線程所調用到的內存與數據,TLS主要用于存放線程的狀態信息。

進程、應用程序域、線程的關系如下圖,一個進程內可以包括多個應用程序域,也有包括多個線程,線程也可以穿梭于多個應用程序域當中。但在同一個時刻,線程只會處于一個應用程序域內。

由于本文是以介紹多線程技術為主題,對進程、應用程序域的介紹就到此為止。關于進程、線程、應用程序域的技術,在“C#綜合揭秘——細說進程、應用程序域與上下文”會有詳細介紹。

1.2 多線程

在單CPU系統的一個單位時間(time slice)內,CPU只能運行單個線程,運行順序取決于線程的優先級別。如果在單位時間內線程未能完成執行,系統就會把線程的狀態信息保存到線程的本地存儲器(TLS) 中,以便下次執行時恢復執行。而多線程只是系統帶來的一個假像,它在多個單位時間內進行多個線程的切換。因為切換頻密而且單位時間非常短暫,所以多線程可被視作同時運行。

適當使用多線程能提高系統的性能,比如:在系統請求大容量的數據時使用多線程,把數據輸出工作交給異步線程,使主線程保持其穩定性去處理其他問題。但需要注意一點,因為CPU需要花費不少的時間在線程的切換上,所以過多地使用多線程反而會導致性能的下降。

返回目錄

二、線程的基礎知識

2.1 System.Threading.Thread類

System.Threading.Thread是用于控制線程的基礎類,通過Thread可以控制當前應用程序域中線程的創建、掛起、停止、銷毀。

它包括以下常用公共屬性:

屬性名稱說明
CurrentContext獲取線程正在其中執行的當前上下文。
CurrentThread獲取當前正在運行的線程。
ExecutionContext獲取一個 ExecutionContext 對象,該對象包含有關當前線程的各種上下文的信息。
IsAlive獲取一個值,該值指示當前線程的執行狀態。
IsBackground獲取或設置一個值,該值指示某個線程是否為后臺線程。
IsThreadPoolThread獲取一個值,該值指示線程是否屬于托管線程池。
ManagedThreadId獲取當前托管線程的唯一標識符。
Name獲取或設置線程的名稱。
Priority獲取或設置一個值,該值指示線程的調度優先級。
ThreadState獲取一個值,該值包含當前線程的狀態。

2.1.1 線程的標識符

ManagedThreadId是確認線程的唯一標識符,程序在大部分情況下都是通過Thread.ManagedThreadId來辨別線程的。而Name是一個可變值,在默認時候,Name為一個空值 Null,開發人員可以通過程序設置線程的名稱,但這只是一個輔助功能。

2.1.2 線程的優先級別

.NET為線程設置了Priority屬性來定義線程執行的優先級別,里面包含5個選項,其中Normal是默認值。除非系統有特殊要求,否則不應該隨便設置線程的優先級別。

成員名稱說明
Lowest可以將 Thread 安排在具有任何其他優先級的線程之后。
BelowNormal可以將 Thread 安排在具有Normal優先級的線程之后,在具有Lowest優先級的線程之前。
Normal默認選擇??梢詫?Thread 安排在具有AboveNormal優先級的線程之后,在具有BelowNormal優先級的線程之前。
AboveNormal可以將 Thread 安排在具有Highest優先級的線程之后,在具有Normal優先級的線程之前。
Highest可以將 Thread 安排在具有任何其他優先級的線程之前。

2.1.3 線程的狀態

通過ThreadState可以檢測線程是處于Unstarted、Sleeping、Running 等等狀態,它比 IsAlive 屬性能提供更多的特定信息。

前面說過,一個應用程序域中可能包括多個上下文,而通過CurrentContext可以獲取線程當前的上下文。

CurrentThread是最常用的一個屬性,它是用于獲取當前運行的線程。

2.1.4 System.Threading.Thread的方法

Thread 中包括了多個方法來控制線程的創建、掛起、停止、銷毀,以后來的例子中會經常使用。

方法名稱說明
Abort()終止本線程。
GetDomain()返回當前線程正在其中運行的當前域。
GetDomainId()返回當前線程正在其中運行的當前域Id。
Interrupt()中斷處于 WaitSleepJoin 線程狀態的線程。
Join()已重載。 阻塞調用線程,直到某個線程終止時為止。
Resume()繼續運行已掛起的線程。
Start()執行本線程。
Suspend()掛起當前線程,如果當前線程已屬于掛起狀態則此不起作用
Sleep()把正在運行的線程掛起一段時間。

2.1.5 開發實例

以下這個例子,就是通過Thread顯示當前線程信息

復制代碼
 1         static void Main(string[] args) 2         { 3             Thread thread = Thread.CurrentThread; 4             thread.Name = "Main Thread"; 5             string threadMessage = string.Format("Thread ID:{0}/n    Current AppDomainId:{1}/n    "+ 6                 "Current ContextId:{2}/n    Thread Name:{3}/n    "+ 7                 "Thread State:{4}/n    Thread Priority:{5}/n", 8                 thread.ManagedThreadId, Thread.GetDomainID(), Thread.CurrentContext.ContextID, 9                 thread.Name, thread.ThreadState, thread.Priority);10             Console.WriteLine(threadMessage);11             Console.ReadKey();12         }
復制代碼

運行結果

2.2 System.Threading 命名空間

在System.Threading命名空間內提供多個方法來構建多線程應用程序,其中ThreadPool與Thread是多線程開發中最常用到的,在.NET中專門設定了一個CLR線程池專門用于管理線程的運行,這個CLR線程池正是通過ThreadPool類來管理。而Thread是管理線程的最直接方式,下面幾節將詳細介紹有關內容。

類    說明
AutoResetEvent通知正在等待的線程已發生事件。無法繼承此類。
ExecutionContext管理當前線程的執行上下文。無法繼承此類。
Interlocked為多個線程共享的變量提供原子操作。
Monitor提供同步對對象的訪問的機制。
Mutex一個同步基元,也可用于進程間同步。
Thread創建并控制線程,設置其優先級并獲取其狀態。
ThreadAbortException在對 Abort 方法進行調用時引發的異常。無法繼承此類。
ThreadPool提供一個線程池,該線程池可用于發送工作項、處理異步 I/O、代表其他線程等待以及處理計時器。
Timeout包含用于指定無限長的時間的常數。無法繼承此類。
Timer提供以指定的時間間隔執行方法的機制。無法繼承此類。
WaitHandle封裝等待對共享資源的獨占訪問的操作系統特定的對象。

在System.Threading中的包含了下表中的多個常用委托,其中ThreadStart、ParameterizedThreadStart是最常用到的委托。 由ThreadStart生成的線程是最直接的方式,但由ThreadStart所生成并不受線程池管理。 而ParameterizedThreadStart是為異步觸發帶參數的方法而設的,在下一節將為大家逐一細說。

委托說明
ContextCallback表示要在新上下文中調用的方法。
ParameterizedThreadStart表示在 Thread 上執行的方法。
ThreadExceptionEventHandler表示將要處理 application 的 ThreadException 事件的方法。
ThreadStart表示在 Thread 上執行的方法。
TimerCallback表示處理來自 Timer 的調用的方法。
WaitCallback表示線程池線程要執行的回調方法。
WaitOrTimerCallback表示當 WaitHandle 超時或終止時要調用的方法。

2.3 線程的管理方式

通過ThreadStart來創建一個新線程是最直接的方法,但這樣創建出來的線程比較難管理,如果創建過多的線程反而會讓系統的性能下載。有見及此,.NET為線程管理專門設置了一個CLR線程池,使用CLR線程池系統可以更合理地管理線程的使用。所有請求的服務都能運行于線程池中,當運行結束時線程便會回歸到線程池。通過設置,能控制線程池的最大線程數量,在請求超出線程最大值時,線程池能按照操作的優先級別來執行,讓部分操作處于等待狀態,待有線程回歸時再執行操作。

基礎知識就為大家介紹到這里,下面將詳細介紹多線程的開發。

返回目錄

三、以ThreadStart方式實現多線程

3.1 使用ThreadStart委托

這里先以一個例子體現一下多線程帶來的好處,首先在Message類中建立一個方法ShowMessage(),里面顯示了當前運行線程的Id,并使用Thread.Sleep(int ) 方法模擬部分工作。在main()中通過ThreadStart委托綁定Message對象的ShowMessage()方法,然后通過Thread.Start()執行異步方法。

復制代碼
 1       public class Message 2       {
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产欧美韩国高清| 成人免费看吃奶视频网站| 亚洲白拍色综合图区| xx视频.9999.com| 福利视频第一区| 992tv成人免费影院| 国模gogo一区二区大胆私拍| 日韩中文字幕视频在线| 91成人性视频| 欧美精品18videos性欧美| 亚洲天堂av女优| 91久久国产精品91久久性色| 欧美理论电影网| 国产精品丝袜久久久久久不卡| 日韩小视频网址| 亚洲无限乱码一二三四麻| 日韩欧美主播在线| 色综合影院在线| 亚洲国产黄色片| 少妇av一区二区三区| 亚洲免费一级电影| 欧美成人免费全部| 亚洲a在线观看| 日韩美女在线看| 欧美性猛交xxxx久久久| 国产美女搞久久| 国产精品电影网站| 国产主播在线一区| 国产精品视频xxxx| 亚洲人成网7777777国产| 日本精品视频在线观看| 日韩在线中文字幕| 亚洲欧美激情四射在线日| 日韩电影网在线| 91精品久久久久久久久久另类| 欧美电影免费观看电视剧大全| 日韩欧美亚洲一二三区| 日韩最新免费不卡| 国产精品一区二区三区久久| 成人激情在线观看| 久久这里只有精品视频首页| 精品国产依人香蕉在线精品| 日韩av一区二区在线观看| 亚洲第一网站男人都懂| 亚洲国产另类 国产精品国产免费| 久久久久久久久国产| 黄色成人在线播放| 狠狠躁夜夜躁人人爽天天天天97| 欧美极品第一页| 亚洲精品国产精品国自产在线| 亚洲国产另类 国产精品国产免费| 亚洲理论电影网| 国产在线拍偷自揄拍精品| 中文字幕日韩av| 久久99热这里只有精品国产| 2019中文字幕在线观看| 国产精品女人久久久久久| 欧美精品生活片| 欧美另类69精品久久久久9999| 欧美日韩国产影院| 国内精品国产三级国产在线专| 久久影院资源站| 7777精品久久久久久| 久久综合九色九九| 亚洲视频在线观看免费| 一本色道久久综合狠狠躁篇怎么玩| 一本大道亚洲视频| 日韩福利视频在线观看| 国产精品电影久久久久电影网| www高清在线视频日韩欧美| 少妇av一区二区三区| 亚洲在线www| 亚洲欧洲日产国码av系列天堂| 亚洲电影免费观看高清完整版在线观看| 国产精品96久久久久久| 欧美另类99xxxxx| 日韩一区在线视频| 欧美专区国产专区| 精品成人国产在线观看男人呻吟| 久久久久久久久久久免费精品| 国产乱人伦真实精品视频| 国产精品爽爽爽爽爽爽在线观看| 日本乱人伦a精品| 97在线精品国自产拍中文| 国产美女久久久| 91国产精品电影| 欧美大片欧美激情性色a∨久久| 色综合天天综合网国产成人网| 日本精品视频网站| 亚洲欧美日韩综合| 欧美精品一区三区| 国产精品女人网站| 日韩精品在线免费| 亚洲精品99久久久久| 国产玖玖精品视频| 国产亚洲在线播放| 亚洲成人在线网| 久久久久国色av免费观看性色| 日韩国产高清视频在线| 北条麻妃一区二区三区中文字幕| 国产在线观看精品| 亚洲精品白浆高清久久久久久| 欧美性猛交xxxx免费看漫画| 综合网日日天干夜夜久久| www.久久撸.com| 欧美午夜丰满在线18影院| 夜夜嗨av一区二区三区四区| 亚洲天堂免费观看| 日本三级韩国三级久久| 久久久久久九九九| 亚洲自拍欧美色图| 国产一区二区三区视频免费| 热久久视久久精品18亚洲精品| 亚洲国产精品久久久久秋霞蜜臀| 亚洲欧美日韩第一区| 国产精品久久久久久久久久久不卡| 欧美专区在线视频| 欧美一区二区视频97| 亚洲激情在线视频| 亚洲欧美一区二区三区情侣bbw| 中文字幕亚洲专区| 亚洲xxx大片| 91理论片午午论夜理片久久| 亚洲精品一区在线观看香蕉| 欧美视频中文字幕在线| 国产成人一区二| 97在线看免费观看视频在线观看| 日韩精品视频在线观看免费| 欧美一区三区三区高中清蜜桃| 欧美在线视频免费| 91精品久久久久久久久中文字幕| 一本久久综合亚洲鲁鲁| 亚洲电影免费观看高清完整版| 国产精品久久久久高潮| 亚洲欧美激情在线视频| 97国产一区二区精品久久呦| 国产综合视频在线观看| 欧美成人激情图片网| 亚洲天堂免费视频| 国产精品成人av性教育| 亚洲自拍在线观看| 韩国福利视频一区| 不卡av电影在线观看| 国产精品精品视频一区二区三区| 久久精品人人做人人爽| 91精品国产色综合久久不卡98口| 欧美视频中文字幕在线| 国产日韩欧美综合| 亚洲天堂免费视频| 国模吧一区二区| www日韩中文字幕在线看| 亚洲精品美女视频| 亚洲国产成人精品久久久国产成人一区| 亚洲成人动漫在线播放| 亚洲在线www| 亚洲奶大毛多的老太婆| 国产欧美中文字幕| 日韩欧中文字幕| 亚洲影院污污.| 欧美性xxxxx| 992tv成人免费影院| 亚洲精品在线视频| 热久久视久久精品18亚洲精品| 中文字幕日韩欧美|