激情五月天婷婷,亚洲愉拍一区二区三区,日韩视频一区,a√天堂中文官网8

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

        細(xì)說多線程(八) —— 計(jì)時(shí)器與鎖

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

        目錄

        一、線程的定義

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

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

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

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

        六、異步 SqlCommand

        七、并行編程與PLINQ

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

         

        八、定時(shí)器與鎖

        8.1定時(shí)器

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

        開發(fā)實(shí)例

             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();
                 }
         
                 //顯示線程池現(xiàn)狀
        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); } }

        注意觀察運(yùn)行結(jié)果,每次調(diào)用Timer綁定的方法時(shí)不一定是使用同一線程,但線程都會是來自工作者線程的后臺線程。


        8.2 鎖

        在使用多線程開發(fā)時(shí),存在一定的共用數(shù)據(jù),為了避免多線程同時(shí)操作同一數(shù)據(jù),.NET提供了lock、Monitor、Interlocked等多個(gè)鎖定數(shù)據(jù)的方式。

        8.2.1 lock

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

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

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

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

         

        8.2.2 Montior

        Montior存在于System.Thread命名空間內(nèi),相比lock,Montior使用更靈活。
        它存在 Enter, Exit 兩個(gè)方法,它可以對對象進(jìn)行鎖定與解鎖,比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對象能夠確保無論是否出現(xiàn)死鎖狀態(tài),系統(tǒng)都會釋放obj對象。
        而且Monitor中還存在Wait方法可以讓線程等待一段時(shí)間,然后在完成時(shí)使用Pulse、PulseAll等方法通知等待線程。

         

        8.2.3 Interlocked

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

        Increment、Decrement 可以使參數(shù)安全地加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使用特別方便,它相當(dāng)于if的用法,當(dāng)a等于1時(shí),則把100賦值給a。

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



        結(jié)束語

        熟悉掌握多線程開發(fā),對提高系統(tǒng)工作效率非常有幫助,尤其是回調(diào)方法與最近火熱的并行編程更應(yīng)該引起各位的重視。
        在下用了較長的時(shí)間總結(jié)所過的多線程開發(fā)方式,希望本篇文章能對各位的學(xué)習(xí)研究有所幫助,當(dāng)中有所錯(cuò)漏的地方敬請點(diǎn)評。

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


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

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

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

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