久久狠狠色噜噜狠狠狠狠97|国产成人久久精品麻豆二区|精品精拍国产日韩26u|色偷偷亚洲第一综合网

始創(chuàng)于2000年 股票代碼:831685
咨詢熱線:0371-60135900 注冊(cè)有禮 登錄
  • 掛牌上市企業(yè)
  • 60秒人工響應(yīng)
  • 99.99%連通率
  • 7*24h人工
  • 故障100倍補(bǔ)償
全部產(chǎn)品
您的位置: 網(wǎng)站首頁(yè) > 幫助中心>文章內(nèi)容

細(xì)說(shuō)多線程(二)—— 線程的基礎(chǔ)知識(shí)

發(fā)布時(shí)間:  2012/9/16 6:32:49

目錄

一、線程的定義

二、線程的基礎(chǔ)知識(shí)

三、以ThreadStart方式實(shí)現(xiàn)多線程

四、CLR線程池的工作者線程

五、CLR線程池的I/O線程

六、異步 SqlCommand

七、并行編程與PLINQ

八、計(jì)時(shí)器與鎖

 

二、線程的基礎(chǔ)知識(shí)

2.1 System.Threading.Thread類

System.Threading.Thread是用于控制線程的基礎(chǔ)類,通過(guò)Thread可以控制當(dāng)前應(yīng)用程序域中線程的創(chuàng)建、掛起、停止、銷毀。

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

屬性名稱 說(shuō)明
CurrentContext 獲取線程正在其中執(zhí)行的當(dāng)前上下文。
CurrentThread 獲取當(dāng)前正在運(yùn)行的線程。

ExecutionContext

獲取一個(gè) ExecutionContext 對(duì)象,該對(duì)象包含有關(guān)當(dāng)前線程的各種上下文的信息。
IsAlive 獲取一個(gè)值,該值指示當(dāng)前線程的執(zhí)行狀態(tài)。
IsBackground 獲取或設(shè)置一個(gè)值,該值指示某個(gè)線程是否為后臺(tái)線程。
IsThreadPoolThread 獲取一個(gè)值,該值指示線程是否屬于托管線程池。
ManagedThreadId 獲取當(dāng)前托管線程的唯一標(biāo)識(shí)符。
Name 獲取或設(shè)置線程的名稱。
Priority 獲取或設(shè)置一個(gè)值,該值指示線程的調(diào)度優(yōu)先級(jí)。
ThreadState 獲取一個(gè)值,該值包含當(dāng)前線程的狀態(tài)。


2.1.1 線程的標(biāo)識(shí)符

ManagedThreadId 是確認(rèn)線程的唯一標(biāo)識(shí)符,程序在大部分情況下都是通過(guò)Thread.ManagedThreadId來(lái)辨別線程的。而Name是一個(gè)可變值,在默認(rèn)時(shí) 候,Name為一個(gè)空值 Null,開(kāi)發(fā)人員可以通過(guò)程序設(shè)置線程的名稱,但這只是一個(gè)輔助功能。


2.1.2 線程的優(yōu)先級(jí)別

.NET為線程設(shè)置了Priority屬性來(lái)定義線程執(zhí)行的優(yōu)先級(jí)別,里面包含5個(gè)選項(xiàng),其中Normal是默認(rèn)值。除非系統(tǒng)有特殊要求,否則不應(yīng)該隨便設(shè)置線程的優(yōu)先級(jí)別。

成員名稱 說(shuō)明
Lowest 可以將 Thread 安排在具有任何其他優(yōu)先級(jí)的線程之后。
BelowNormal 可以將 Thread 安排在具有 Normal 優(yōu)先級(jí)的線程之后,在具有 Lowest 優(yōu)先級(jí)的線程之前。
Normal 默認(rèn)選擇?梢詫 Thread 安排在具有 AboveNormal 優(yōu)先級(jí)的線程之后,在具有 BelowNormal 優(yōu)先級(jí)的線程之前。
AboveNormal 可以將 Thread 安排在具有 Highest 優(yōu)先級(jí)的線程之后,在具有 Normal 優(yōu)先級(jí)的線程之前。
Highest 可以將 Thread 安排在具有任何其他優(yōu)先級(jí)的線程之前。


2.1.3 線程的狀態(tài)

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

前面說(shuō)過(guò),一個(gè)應(yīng)用程序域中可能包括多個(gè)上下文,而通過(guò)CurrentContext可以獲取線程當(dāng)前的上下文。

CurrentThread是最常用的一個(gè)屬性,它是用于獲取當(dāng)前運(yùn)行的線程。


2.1.4 System.Threading.Thread的方法

Thread 中包括了多個(gè)方法來(lái)控制線程的創(chuàng)建、掛起、停止、銷毀,以后來(lái)的例子中會(huì)經(jīng)常使用。

方法名稱 說(shuō)明
Abort()     終止本線程。
GetDomain() 返回當(dāng)前線程正在其中運(yùn)行的當(dāng)前域。
GetDomainId() 返回當(dāng)前線程正在其中運(yùn)行的當(dāng)前域Id。
Interrupt() 中斷處于 WaitSleepJoin 線程狀態(tài)的線程。
Join() 已重載。 阻塞調(diào)用線程,直到某個(gè)線程終止時(shí)為止。
Resume() 繼續(xù)運(yùn)行已掛起的線程。
Start()   執(zhí)行本線程。
Suspend() 掛起當(dāng)前線程,如果當(dāng)前線程已屬于掛起狀態(tài)則此不起作用
Sleep()   把正在運(yùn)行的線程掛起一段時(shí)間。

 

2.1.5 開(kāi)發(fā)實(shí)例

以下這個(gè)例子,就是通過(guò)Thread顯示當(dāng)前線程信息

 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         }

 

運(yùn)行結(jié)果

 

2.2  System.Threading 命名空間

在 System.Threading命名空間內(nèi)提供多個(gè)方法來(lái)構(gòu)建多線程應(yīng)用程序,其中ThreadPool與Thread是多線程開(kāi)發(fā)中最常用到的, 在.NET中專門設(shè)定了一個(gè)CLR線程池專門用于管理線程的運(yùn)行,這個(gè)CLR線程池正是通過(guò)ThreadPool類來(lái)管理。而Thread是管理線程的最 直接方式,下面幾節(jié)將詳細(xì)介紹有關(guān)內(nèi)容。

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


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

委托 說(shuō)明
ContextCallback 表示要在新上下文中調(diào)用的方法。
ParameterizedThreadStart 表示在 Thread 上執(zhí)行的方法。
ThreadExceptionEventHandler 表示將要處理 Application 的 ThreadException 事件的方法。
ThreadStart 表示在 Thread 上執(zhí)行的方法。
TimerCallback 表示處理來(lái)自 Timer 的調(diào)用的方法。
WaitCallback 表示線程池線程要執(zhí)行的回調(diào)方法。
WaitOrTimerCallback 表示當(dāng) WaitHandle 超時(shí)或終止時(shí)要調(diào)用的方法。

 

2.3 線程的管理方式

通 過(guò)ThreadStart來(lái)創(chuàng)建一個(gè)新線程是最直接的方法,但這樣創(chuàng)建出來(lái)的線程比較難管理,如果創(chuàng)建過(guò)多的線程反而會(huì)讓系統(tǒng)的性能下載。有見(jiàn)及 此,.NET為線程管理專門設(shè)置了一個(gè)CLR線程池,使用CLR線程池系統(tǒng)可以更合理地管理線程的使用。所有請(qǐng)求的服務(wù)都能運(yùn)行于線程池中,當(dāng)運(yùn)行結(jié)束時(shí) 線程便會(huì)回歸到線程池。通過(guò)設(shè)置,能控制線程池的最大線程數(shù)量,在請(qǐng)求超出線程最大值時(shí),線程池能按照操作的優(yōu)先級(jí)別來(lái)執(zhí)行,讓部分操作處于等待狀態(tài),待 有線程回歸時(shí)再執(zhí)行操作。

基礎(chǔ)知識(shí)就為大家介紹到這里,下面將詳細(xì)介紹多線程的開(kāi)發(fā)。
 

億恩-天使(QQ:530997) 電話 037160135991 服務(wù)器租用,托管歡迎咨詢。


本文出自:億恩科技【www.yaz797.com】

服務(wù)器租用/服務(wù)器托管中國(guó)五強(qiáng)!虛擬主機(jī)域名注冊(cè)頂級(jí)提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM]

  • 您可能在找
  • 億恩北京公司:
  • 經(jīng)營(yíng)性ICP/ISP證:京B2-20150015
  • 億恩鄭州公司:
  • 經(jīng)營(yíng)性ICP/ISP/IDC證:豫B1.B2-20060070
  • 億恩南昌公司:
  • 經(jīng)營(yíng)性ICP/ISP證:贛B2-20080012
  • 服務(wù)器/云主機(jī) 24小時(shí)售后服務(wù)電話:0371-60135900
  • 虛擬主機(jī)/智能建站 24小時(shí)售后服務(wù)電話:0371-60135900
  • 專注服務(wù)器托管17年
    掃掃關(guān)注-微信公眾號(hào)
    0371-60135900
    Copyright© 1999-2019 ENKJ All Rights Reserved 億恩科技 版權(quán)所有  地址:鄭州市高新區(qū)翠竹街1號(hào)總部企業(yè)基地億恩大廈  法律顧問(wèn):河南亞太人律師事務(wù)所郝建鋒、杜慧月律師   京公網(wǎng)安備41019702002023號(hào)
      0
     
     
     
     

    0371-60135900
    7*24小時(shí)客服服務(wù)熱線