• <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:40:51

    目錄

    一、線程的定義

    二、線程的基礎知識

    三、以ThreadStart方式實現多線程

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

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

    六、異步 SqlCommand

    七、并行編程與PLINQ

    八、計時器與鎖

     

    八、定時器與鎖

    8.1定時器

    若要長期定時進行一些工作,比如像郵箱更新,實時收聽信息等等,可以利用定時器Timer進行操作。
    在System.Threading命名空間中存在Timer類與對應的TimerCallback委托,它可以在后臺線程中執行一些長期的定時操作,使主線程不受干擾。
    Timer類中最常用的構造函數為 public Timer( timerCallback , object , int , int )
    timerCallback委托可以綁定執行方法,執行方法必須返回void,它可以是無參數方法,也可以帶一個object參數的方法。
    第二個參數是為 timerCallback 委托輸入的參數對象。
    第三個參數是開始執行前等待的時間。
    第四個參數是每次執行之間的等待時間。

    開發實例

         class Program
         {
             static void Main(string[] args)
             {
                 ThreadPool.SetMaxThreads(1000, 1000);
     
                 TimerCallback callback = new TimerCallback(ThreadPoolMessage);
                 Timer t = new Timer(callback,"Hello Jack! ", 0, 1000);
                 Console.ReadKey();
             }
     
             //顯示線程池現狀
    static void ThreadPoolMessage(object data) { int a, b; ThreadPool.GetAvailableThreads(out a, out b); string message = string.Format("{0}\n CurrentThreadId is:{1}\n" + " CurrentThread IsBackground:{2}\n" + " WorkerThreads is:{3}\n CompletionPortThreads is:{4}\n", data + "Time now is " + DateTime.Now.ToLongTimeString(), Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsBackground.ToString(), a.ToString(), b.ToString()); Console.WriteLine(message); } }

    注意觀察運行結果,每次調用Timer綁定的方法時不一定是使用同一線程,但線程都會是來自工作者線程的后臺線程。


    8.2 鎖

    在使用多線程開發時,存在一定的共用數據,為了避免多線程同時操作同一數據,.NET提供了lock、Monitor、Interlocked等多個鎖定數據的方式。

    8.2.1 lock

    lock的使用比較簡單,如果需要鎖定某個對象時,可以直接使用lock(this)的方式。

    1 private void Method()
    2 {
    3       lock(this)
    4       {
    5           //在此進行的操作能保證在同一時間內只有一個線程對此對象操作
    6 } 7 }

    如果操作只鎖定某段代碼,可以事先建立一個object對象,并對此對象進行操作鎖定,這也是.net提倡的鎖定用法。

     class Control
     {
           private object obj=new object();
           
           public void Method()
           {
                 lock(obj)
                 {.......}
           }
     }

     

    8.2.2 Montior

    Montior存在于System.Thread命名空間內,相比lock,Montior使用更靈活。
    它存在 Enter, Exit 兩個方法,它可以對對象進行鎖定與解鎖,比lock使用更靈活。

     1 class Control
     2 {
     3       private object obj=new object();
     4  
     5       public void Method()
     6       {
     7             Monitor.Enter(obj);
     8             try
     9             {......}
    10             catch(Excetion ex)
    11             {......}
    12             finally
    13             {
    14                 Monitor.Exit(obj);
    15             }
    16       }
    17 }
    18          

    使用try的方式,能確保程序不會因死鎖而釋放出異常!
    而且在finally中釋放obj對象能夠確保無論是否出現死鎖狀態,系統都會釋放obj對象。
    而且Monitor中還存在Wait方法可以讓線程等待一段時間,然后在完成時使用Pulse、PulseAll等方法通知等待線程。

     

    8.2.3 Interlocked

    Interlocked存在于System.Thread命名空間內,它的操作比Monitor使用更簡單。
    它存在CompareExchange、Decrement、Exchange、Increment等常用方法讓參數在安全的情況進行數據交換。

    Increment、Decrement 可以使參數安全地加1或減1并返回遞增后的新值。

     class Example
     {
           private int a=1;
     
           public void AddOne()
           {
                  int newA=Interlocked.Increment(ref a);
           }
     }

    Exchange可以安全地變量賦值。

    1 public void SetData()
    2 {
    3       Interlocked.Exchange(ref a,100);
    4 }

    CompareExchange使用特別方便,它相當于if的用法,當a等于1時,則把100賦值給a。

     public void CompareAndExchange()
     {
         Interlocked.CompareExchange(ref a,100,1);
     }



    結束語

    熟悉掌握多線程開發,對提高系統工作效率非常有幫助,尤其是回調方法與最近火熱的并行編程更應該引起各位的重視。
    在下用了較長的時間總結所過的多線程開發方式,希望本篇文章能對各位的學習研究有所幫助,當中有所錯漏的地方敬請點評。

    億恩-天使(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號
      0
     
     
     
     

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