• <ul id="mayc0"></ul>
    <ul id="mayc0"><center id="mayc0"></center></ul>
    <strike id="mayc0"><input id="mayc0"></input></strike>
    <ul id="mayc0"></ul>
  • 始創于2000年 股票代碼:831685
    咨詢熱線:0371-60135900 注冊有禮 登錄
    • 掛牌上市企業
    • 60秒人工響應
    • 99.99%連通率
    • 7*24h人工
    • 故障100倍補償
    您的位置: 網站首頁 > 幫助中心>文章內容

    細說多線程(二)—— 線程的基礎知識

    發布時間:  2012/9/16 6:32:49

    目錄

    一、線程的定義

    二、線程的基礎知識

    三、以ThreadStart方式實現多線程

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

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

    六、異步 SqlCommand

    七、并行編程與PLINQ

    八、計時器與鎖

     

    二、線程的基礎知識

    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線程池系統可以更合理地管理線程的使用。所有請求的服務都能運行于線程池中,當運行結束時 線程便會回歸到線程池。通過設置,能控制線程池的最大線程數量,在請求超出線程最大值時,線程池能按照操作的優先級別來執行,讓部分操作處于等待狀態,待 有線程回歸時再執行操作。

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

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


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

    服務器租用/服務器托管中國五強!虛擬主機域名注冊頂級提供商!15年品質保障!--億恩科技[ENKJ.COM]

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

    0371-60135900
    7*24小時客服服務熱線