欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#中定時任務(wù)被阻塞問題的解決方法

 更新時間:2021年11月12日 14:42:48   作者:JerryMouseLi  
這篇文章主要給大家介紹了關(guān)于C#中定時任務(wù)被阻塞問題的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用c#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

1.摘要

本文會介紹一個C#中最簡單定時任務(wù)的使用方法,以及會遇到的定時任務(wù)被阻塞現(xiàn)象,從筆者理解的角度分析原因。以及提供解決方案。

2.C#中定時任務(wù)的最簡方法

  protected internal void PollClient()
  {
      int i=0;
      Timer t = new Timer(p => {
          i++;
          if (deviceContextList.Count > 0)
          {
              var deviceContext=GetDeviceContext("123456789");
                  SendMessage(messageList[i%7],deviceContext.tcpSession.writerContext);
              logger.Info("客戶端數(shù)量:"+ deviceContextList.Count);        
          }
          else 
          {
              logger.Info("客戶端數(shù)量為0");
              Console.WriteLine("客戶端數(shù)量為0");
          }              
      }, null, 0, 1000) ;           
  }

上面的timer方法提供于微軟System.Threading命名空間。System.Threading.Timer 是由線程池調(diào)用的。所有的Timer對象只使用了一個線程來管理。這個線程知道下一個回調(diào)對象在什么時候到期。下一個回調(diào)對象到期時,線程就會喚醒,在內(nèi)部調(diào)用ThreadPool 的 QueueUserWorkItem,將一個工作項(xiàng)添加到線程池隊(duì)列中,使你的回調(diào)方法得到調(diào)用。此方法有多個重載,具體讀者可以自行去看。

Timer(TimerCallback callback, object state, int dueTime, int period)

第一個參數(shù)callback是回調(diào)方法,第二個參數(shù)state可以傳參給回調(diào)方法的參數(shù),第三個參數(shù)dueTime是第一次執(zhí)行回調(diào)函數(shù)的延時時間,單位毫秒,第四個參數(shù)period是調(diào)用回調(diào)函數(shù)的時間間隔。使用起來是不是特別方便,把你需要執(zhí)行的定時任務(wù)放在回調(diào)方法中,可獨(dú)立寫成方法,也可像上面一樣寫成匿名方法的形式。

3.定時任務(wù)阻塞現(xiàn)象

當(dāng)上述任務(wù)被執(zhí)行了幾千次以后,定時任務(wù)會阻塞,不再執(zhí)行,也不再打印日志。并且上面的寫法有缺陷,。如果回調(diào)方法的執(zhí)行時間很長,計(jì)時器可能(在上個回調(diào)還沒有完成的時候)再次觸發(fā)。這可能造成多個線程池線程同時執(zhí)行你的回調(diào)方法。并且線程切換也會造成諸多損耗時間。

4.阻塞現(xiàn)象原因分析

上面的方法中使用局部變量來創(chuàng)建指向一個線程定時器。因?yàn)榫植孔兞繒籊C回收,導(dǎo)致定時器失效。
具體改進(jìn)如下:

static int i=0;
static Timer _timer = null;
        protected  void PollClient()
        {
             _timer = new Timer(TimerCallback, null, 1000, Timeout.Infinite) ;           
        }
    private void TimerCallback(object state)
    {
            try
            {
                i++;
              
                if (deviceContextList.Count > 0)
                {
                    var deviceContext = GetDeviceContext("123456789");
                    SendMessage(messageList[i % 7], deviceContext.tcpSession.writerContext);
                    logger.Info("客戶端數(shù)量:" + deviceContextList.Count + "循環(huán)次數(shù):" + i);

                }
                else
                {
                    logger.Info("客戶端數(shù)量為0" + "循環(huán)次數(shù):" + i);
                    Console.WriteLine("客戶端數(shù)量為0" + "循環(huán)次數(shù):" + i);
                }
            }
            catch (Exception e)
            {
                logger.Error("定時測試下發(fā)報(bào)文異常:" + e);
            }
            finally
            {
                _timer.Change( 1000, Timeout.Infinite);
            }
        }

將定時器與計(jì)數(shù)變量設(shè)置為static是為了定時器不被GC回收。定時任務(wù)執(zhí)行完成之后再設(shè)置下次調(diào)用時間間隔是為了該任務(wù)不過多占用線程池中的線程,節(jié)省線程切換時間等。

5.問題解決

可以看到任務(wù)已經(jīng)被執(zhí)行了86665次,優(yōu)化后不再被GC回收。

總結(jié)

到此這篇關(guān)于C#中定時任務(wù)被阻塞問題解決的文章就介紹到這了,更多相關(guān)C#定時任務(wù)被阻塞內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關(guān)文章

  • C# WINFORM自定義異常處理方法

    C# WINFORM自定義異常處理方法

    這篇文章主要介紹了一個簡單的統(tǒng)一異常處理方法。系統(tǒng)底層出現(xiàn)異常,寫入記錄文件,系統(tǒng)頂層捕獲底層異常,顯示提示信息。需要的可以參考一下
    2021-12-12
  • C#中WebBroeser控件用法實(shí)例教程

    C#中WebBroeser控件用法實(shí)例教程

    這篇文章主要介紹了C#中WebBroeser控件用法,包括了常用屬性、事件處理及應(yīng)用實(shí)例,需要的朋友可以參考下
    2014-09-09
  • c# NPOI 如何在指定單元格導(dǎo)入導(dǎo)出圖片

    c# NPOI 如何在指定單元格導(dǎo)入導(dǎo)出圖片

    這篇文章主要介紹了c# NPOI 如何在指定單元格導(dǎo)入導(dǎo)出圖片,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-03-03
  • c# 給pdf添加數(shù)字簽名的步驟

    c# 給pdf添加數(shù)字簽名的步驟

    這篇文章主要介紹了c# 給pdf添加數(shù)字簽名的步驟,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2020-12-12
  • WPF仿三星手機(jī)充電界面實(shí)現(xiàn)代碼

    WPF仿三星手機(jī)充電界面實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了WPF仿三星手機(jī)充電界面實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-08-08
  • C#統(tǒng)計(jì)字符串里中文漢字個數(shù)的方法

    C#統(tǒng)計(jì)字符串里中文漢字個數(shù)的方法

    這篇文章主要介紹了C#統(tǒng)計(jì)字符串里中文漢字個數(shù)的方法,本文通過正則實(shí)現(xiàn)統(tǒng)計(jì)出一段字符串里中文字?jǐn)?shù),需要的朋友可以參考下
    2014-08-08
  • Unity OnGUI實(shí)時顯示游戲FPS

    Unity OnGUI實(shí)時顯示游戲FPS

    這篇文章主要為大家詳細(xì)介紹了Unity OnGUI實(shí)時顯示游戲FPS,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • C#仿Windows XP自帶的掃雷游戲

    C#仿Windows XP自帶的掃雷游戲

    這篇文章主要為大家詳細(xì)介紹了C#仿Windows XP自帶的掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • C#簡單發(fā)送email的方法

    C#簡單發(fā)送email的方法

    這篇文章主要介紹了C#簡單發(fā)送email的方法,涉及C#發(fā)送Email的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-04-04
  • 如何使用C#將Tensorflow訓(xùn)練的.pb文件用在生產(chǎn)環(huán)境詳解

    如何使用C#將Tensorflow訓(xùn)練的.pb文件用在生產(chǎn)環(huán)境詳解

    這篇文章主要給大家介紹了關(guān)于如何使用C#將Tensorflow訓(xùn)練的.pb文件用在生產(chǎn)環(huán)境的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11

最新評論