最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# Task.Run使用問題解決

 更新時間:2025年12月12日 10:31:33   作者:WYXsdad11  
本文主要介紹了C# Task.Run使用問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

最近遇到一個問題:使用一個Thread.Timer的定時器每隔250毫秒輸出一串數(shù)據(jù),與此同時,有其他幾個Task在往數(shù)據(jù)庫更新數(shù)據(jù),這個過程比較耗時。因此這個數(shù)據(jù)庫操作影響了定時器輸出數(shù)據(jù)的操作,導致輸出數(shù)據(jù)延時了。由此問題寫了一個Demo進行測試:

private void Form1_Load(object sender,EventArgs e)
{
    TimerCallbacl svCallBack=BatchQuerySVData;
    System.Threading.Timer _timer=new System.Threading.Timer(svCallBack,null,0,250);
}

public static async void BatchQuerySVData(object state)
{
    await Task.Run(()=>{
        Console.WriteLine(Index++);
        Thread.Sleep(200);
    });
}

private void button1_Clcik(object sender,EventArgs e)
{
    for(int i=0;i<=2;i++)
    {
        Task.Run(()=>{
            Thread.Sleep(1000*10);
        });
    }
}

如上,當一個定時器的Task每250毫秒輸出數(shù)據(jù)時,此時增加一個耗時的點擊事件的Task,當頻繁點擊按鈕時,定時器的Task輸出的數(shù)據(jù)會發(fā)生延遲。

由此了解了一下Task及線程池的運行機制:

Task的核心機制包含以下幾個關鍵組成部分:

  1. 任務調度器(TaskScheduler)

    • 默認使用線程池任務調度器
    • 負責任務的排隊和執(zhí)行
    • 支持工作竊取算法提高CPU利用率
  2. 狀態(tài)管理

    • 維護任務的生命周期狀態(tài)(Created、WaitingToRun、Running、Completed等)
    • 通過狀態(tài)機管理異步操作的執(zhí)行流程
  3. 延續(xù)任務(Continuation)

    • 使用ContinueWithawait創(chuàng)建任務鏈
    • 自動處理任務間的依賴關系
  4. 線程池集成

    • 重用線程池線程,避免頻繁創(chuàng)建銷毀線程
    • 動態(tài)調整線程數(shù)量以適應負載變化
  5. 異常處理

    • 將異常封裝在Task對象中
    • 支持統(tǒng)一的異常捕獲和處理機制

線程池使用隊列機制來管理任務:

  • 全局隊列(Global Queue):接收所有新提交的任務
  • 本地隊列(Local Queue):每個工作線程都有自己的本地隊列,用于存放從全局隊列中獲取的任務

任務處理流程

  1. 任務提交‌:新任務進入全局隊列
  2. 工作線程分配‌:空閑線程從全局隊列獲取任務執(zhí)行
  3. 工作竊取(Work Stealing)‌:當線程本地隊列為空時,可以從其他線程的本地隊列"竊取"任務
  4. 線程管理‌:線程池根據(jù)任務數(shù)量動態(tài)調整工作線程數(shù)
  5. 任務調度‌:使用先進先出(FIFO)原則處理隊列中的任務

這種設計實現(xiàn)了高效的負載均衡,避免了線程頻繁創(chuàng)建銷毀的開銷,同時通過工作竊取機制提高了CPU利用率。

由此了解,上述代碼的執(zhí)行延遲的原因可能是:

定時器回調提交任務到線程池 → 任務進入全局隊列 → 線程池分配可用線程執(zhí)行 → 當長時間運行的數(shù)據(jù)庫任務占用所有線程時,新的定時器任務只能在隊列中等待 → 導致執(zhí)行延遲。

然后進行一些驗證工作:

排除定時器的原因:去掉定時器,使用while(true)不停創(chuàng)建Task,結果仍然存在延遲問題。

private void Form1_Load(object sender,EventArgs e)
{
    BatchQuerySVData(null);
}

public static async void BatchQuerySVData(object state)
{
   while(true)
   {
       await Task.Run(()=>{
          Console.WriteLine(Index++);
          Thread.Sleep(200);
    });
   }
}

進一步驗證,改用Thread專用線程處理定時任務

private Thread _timerThread;
private void Form1_Load(object sender, EventArgs e)
{
    _timerThread = new Thread(() =>
    {
        while (true)
        {
            Console.WriteLine(Index++);
            Thread.Sleep(250); // 精確控制間隔
        }
    })
    { IsBackground = true };
    _timerThread.Start();
}

修改后果然沒有延遲問題了。

問題原因總結:

1.雙重排隊:定時器回調本身就是在線程池處理,內(nèi)部又使用Task.Run創(chuàng)建了另一個線程池任務

2.線程饑餓:長時間運行的數(shù)據(jù)庫任務(10秒)占用線程池線程,導致定時器任務無法及時獲取線程,且存在大量高并發(fā)任務提交影響程序性能和響應能力。

3.線程切換開銷:頻繁創(chuàng)建短生命周期任務引發(fā)線程切換開銷增大,后續(xù)任務排隊等待。

4.隊列堆積:當線程池所有線程都被長時間任務占用時,新的定時器任務只能在隊列中等待。

到此這篇關于C# Task.Run使用問題解決的文章就介紹到這了,更多相關C# Task.Run使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • c# 如何自己實現(xiàn)一個ORM框架

    c# 如何自己實現(xiàn)一個ORM框架

    這篇文章主要介紹了c# 如何自己實現(xiàn)一個ORM,幫助大家更好的理解和學習使用c#,感興趣的朋友可以了解下
    2021-03-03
  • C#中int[][]與int[,]的使用與區(qū)別

    C#中int[][]與int[,]的使用與區(qū)別

    本文主要介紹了C#中int[][]與int[,]的使用與區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • C# 委托(delegate) 的小例子

    C# 委托(delegate) 的小例子

    利用委托(delegate)好像也能解決避免大量switch case的代碼。
    2013-03-03
  • C#中HttpWebRequest、WebClient、HttpClient的使用詳解

    C#中HttpWebRequest、WebClient、HttpClient的使用詳解

    這篇文章主要介紹了C#中HttpWebRequest、WebClient、HttpClient的使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-12-12
  • C#添加Windows服務 定時任務

    C#添加Windows服務 定時任務

    這篇文章主要為大家詳細介紹了C#添加Windows服務,定時任務的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • C#使用ZXing實現(xiàn)二維碼和條形碼的生成

    C#使用ZXing實現(xiàn)二維碼和條形碼的生成

    這篇文章主要為大家詳細介紹了C#如何使用ZXing實現(xiàn)二維碼和條形碼的生成與識別,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-11-11
  • c#操作json示例分享

    c#操作json示例分享

    這篇文章主要介紹了c#操作json示例,需要的朋友可以參考下
    2014-03-03
  • C#中比較兩個List是否相等的常見方法

    C#中比較兩個List是否相等的常見方法

    在?C#?里,比較兩個?List?是否相等,需要考慮多個方面,例如列表中的元素順序、元素本身是否相等,下面介紹幾種常見的比較方法,需要的朋友可以參考下
    2025-04-04
  • C#中的多態(tài)深入理解

    C#中的多態(tài)深入理解

    如果面試時主考官要求你用一句話來描述多態(tài),盡可能的精煉,你會怎么回答?當然答案有很多,每個人的理解和表達不盡相同,但我比較趨向這樣描述:通過繼承實現(xiàn)的不同對象調用相同的方法,表現(xiàn)出不同的行為,稱之為多態(tài)
    2014-01-01
  • Unity UGUI實現(xiàn)滑動翻頁直接跳轉頁數(shù)

    Unity UGUI實現(xiàn)滑動翻頁直接跳轉頁數(shù)

    這篇文章主要為大家詳細介紹了Unity UGUI實現(xiàn)滑動翻頁,直接跳轉頁數(shù),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04

最新評論

凤庆县| 彰化县| 高雄县| 福清市| 静宁县| 库伦旗| 兴城市| 四平市| 承德县| 旅游| 海林市| 建德市| 沧州市| 精河县| 邮箱| 丘北县| 通山县| 石台县| 东乡县| 佳木斯市| 英德市| 延寿县| 静乐县| 永善县| 九寨沟县| 乐业县| 德惠市| 隆昌县| 卢湾区| 喜德县| 望奎县| 平南县| 盖州市| 内乡县| 曲松县| 濮阳市| 阿克陶县| 吴旗县| 宜丰县| 尼玛县| 姜堰市|