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

C# Task.Run使用問題解決

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

最近遇到一個問題:使用一個Thread.Timer的定時器每隔250毫秒輸出一串?dāng)?shù)據(jù),與此同時,有其他幾個Task在往數(shù)據(jù)庫更新數(shù)據(jù),這個過程比較耗時。因此這個數(shù)據(jù)庫操作影響了定時器輸出數(shù)據(jù)的操作,導(dǎo)致輸出數(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);
        });
    }
}

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

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

Task的核心機制包含以下幾個關(guān)鍵組成部分:

  1. 任務(wù)調(diào)度器(TaskScheduler)

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

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

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

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

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

線程池使用隊列機制來管理任務(wù):

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

任務(wù)處理流程

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

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

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

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

然后進行一些驗證工作:

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

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專用線程處理定時任務(wù)

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();
}

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

問題原因總結(jié):

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

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

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

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

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

相關(guān)文章

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

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

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

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

    本文主要介紹了C#中int[][]與int[,]的使用與區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    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的使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • C#添加Windows服務(wù) 定時任務(wù)

    C#添加Windows服務(wù) 定時任務(wù)

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

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

    這篇文章主要為大家詳細(xì)介紹了C#如何使用ZXing實現(xiàn)二維碼和條形碼的生成與識別,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    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),盡可能的精煉,你會怎么回答?當(dāng)然答案有很多,每個人的理解和表達(dá)不盡相同,但我比較趨向這樣描述:通過繼承實現(xiàn)的不同對象調(diào)用相同的方法,表現(xiàn)出不同的行為,稱之為多態(tài)
    2014-01-01
  • Unity UGUI實現(xiàn)滑動翻頁直接跳轉(zhuǎn)頁數(shù)

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

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

最新評論

通道| 周至县| 贵定县| 万盛区| 玉山县| 富宁县| 阿巴嘎旗| 黎城县| 乐安县| 达州市| 罗城| 益阳市| 天峨县| 收藏| 仙居县| 南开区| 东港市| 闵行区| 兰溪市| 东乡县| 岳西县| 武宣县| 湖北省| 安溪县| 武强县| 永安市| 宣武区| 黄平县| 西平县| 丰镇市| 沙雅县| 来凤县| 尼玛县| 凤台县| 上饶县| 星座| 宜宾市| 将乐县| 兰坪| 藁城市| 东安县|