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

C#中Task.Yield的用途深入講解

 更新時(shí)間:2018年11月01日 08:32:32   作者:dudu  
這篇文章主要給大家介紹了關(guān)于C#中Task.Yield的用途的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

最近在閱讀 .NET Threadpool starvation, and how queuing makes it worse 這篇博文時(shí)發(fā)現(xiàn)文中代碼中的一種 Task 用法之前從未見過,在網(wǎng)上看了一些資料后也是云里霧里不知其解,很是困擾。今天在程序員節(jié)的大好日子里終于想通了,于是寫下這篇隨筆分享給大家,也過過專心寫博客的癮。

這種從未見過的用法就是下面代碼中的 await Task.Yield()

static async Task Process()
{
 await Task.Yield();

 var tcs = new TaskCompletionSource<bool>();

 Task.Run(() =>
 {
  Thread.Sleep(1000);
  tcs.SetResult(true);
 });

 tcs.Task.Wait();
}

注:上面的代碼不是示例,只是因?yàn)檫@段代碼而初遇 await Task.Yield

Task.Yield 簡(jiǎn)單來說就是創(chuàng)建時(shí)就已經(jīng)完成的 Task ,或者說執(zhí)行時(shí)間為0的 Task ,或者說是空任務(wù),也就是在創(chuàng)建時(shí)就將 Task 的 IsCompeted 值設(shè)置為0。

那 await 一個(gè)空任務(wù)會(huì)怎樣?我們知道在 await 時(shí)會(huì)釋放當(dāng)前線程,等所 await 的 Task 完成時(shí)會(huì)從線程池中申請(qǐng)新的線程繼續(xù)執(zhí)行 await 之后的代碼,這本來是為了解決異步操作(比如IO操作)霸占線程實(shí)際卻用不到線程的問題,而 Task.Yield 卻產(chǎn)生了一個(gè)不僅沒有異步操作而且什么也不干的 Task ,不是吃飽了撐著嗎?

今天吃晚飯的時(shí)候終于想明白了——吃飽了沒有撐。Task.Yield 產(chǎn)生的空任務(wù)僅僅是為 await 做嫁衣,而真正的圖謀是借助 await 實(shí)現(xiàn)線程的切換,讓 await 之后的操作重新排隊(duì)從線程池中申請(qǐng)線程繼續(xù)執(zhí)行。

這樣做有什么好處呢?

線程是非常非常寶貴的資源,千金難買一線程,而且有優(yōu)先級(jí),提高線程利用率的重要手段之一就是及時(shí)將線程分配給最需要的地方,而最奢侈的之一是讓一個(gè)優(yōu)先級(jí)低執(zhí)行時(shí)間長(zhǎng)的操作一直占用著一個(gè)線程,await Task.Yield 可以讓你巧妙地借助 await 的線程切換能力,將不太重要的比較耗時(shí)的操作放在新的線程(重新排隊(duì)從線程池中申請(qǐng)到的線程)中執(zhí)行。打個(gè)比方,很多人排隊(duì)在外婆家就餐,你來的時(shí)候比較巧,正好有位置,但你本來就不著急肚子也不太餓準(zhǔn)備慢慢吃慢慢聊,而排隊(duì)的人當(dāng)中有些人很餓很著急吃完還有事,這時(shí)你如果先點(diǎn)幾個(gè)招牌菜解解饞,然后將座位讓出來,重新排隊(duì),并且排隊(duì)的人當(dāng)中像你這樣的都這么做,那些排隊(duì)中心急如焚的人真是是幸福感爆棚,外婆家的老板也笑彎了腰。你讓出座位重新排隊(duì)的愛心行為就是 await Task.Yield() 。

結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • C#圖像重新著色的方法

    C#圖像重新著色的方法

    這篇文章主要介紹了C#圖像重新著色的方法,涉及C#中SetRemapTable方法替換顏色的相關(guān)使用技巧,需要的朋友可以參考下
    2015-06-06
  • C#導(dǎo)出數(shù)據(jù)到Excel文件的方法

    C#導(dǎo)出數(shù)據(jù)到Excel文件的方法

    這篇文章主要介紹了C#導(dǎo)出數(shù)據(jù)到Excel文件的方法,涉及C#操作Excel的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-04-04
  • C#正則表達(dá)式獲取下拉菜單(select)的相關(guān)屬性值

    C#正則表達(dá)式獲取下拉菜單(select)的相關(guān)屬性值

    這篇文章主要介紹了C#正則表達(dá)式獲取下拉菜單(select)的相關(guān)屬性值,比如可以獲得name屬性的值、value值、指定值,需要的朋友可以參考下
    2014-07-07
  • 使用代理模式來進(jìn)行C#設(shè)計(jì)模式開發(fā)的基礎(chǔ)教程

    使用代理模式來進(jìn)行C#設(shè)計(jì)模式開發(fā)的基礎(chǔ)教程

    這篇文章主要介紹了使用代理模式來進(jìn)行C#設(shè)計(jì)模式開發(fā)的基礎(chǔ)教程,代理模式主張?jiān)诳蛻舳撕湍繕?biāo)對(duì)象中間建立中介來降低程序設(shè)計(jì)的耦合度,需要的朋友可以參考下
    2016-02-02
  • 使用C#表達(dá)式樹實(shí)現(xiàn)對(duì)象的深克隆(實(shí)例詳解)

    使用C#表達(dá)式樹實(shí)現(xiàn)對(duì)象的深克隆(實(shí)例詳解)

    C# 的表達(dá)式樹提供了一個(gè)強(qiáng)大的機(jī)制,可以將代碼以數(shù)據(jù)結(jié)構(gòu)的形式表示出來,使得代碼可以在運(yùn)行時(shí)進(jìn)行檢查、修改或執(zhí)行,這為動(dòng)態(tài)查詢生成、代碼優(yōu)化和動(dòng)態(tài)編程提供了很多可能性,這篇文章主要介紹了使用C#強(qiáng)大的表達(dá)式樹實(shí)現(xiàn)對(duì)象的深克隆,需要的朋友可以參考下
    2024-05-05
  • C#數(shù)據(jù)適配器DataAdapter

    C#數(shù)據(jù)適配器DataAdapter

    這篇文章介紹了C#中的數(shù)據(jù)適配器DataAdapter,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • C#實(shí)現(xiàn)一鍵批量合并PDF文檔

    C#實(shí)現(xiàn)一鍵批量合并PDF文檔

    這篇文章主要為大家詳細(xì)介紹了如何使用C#實(shí)現(xiàn)一鍵批量合并PDF文檔功能,文中的示例代碼簡(jiǎn)潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-09-09
  • C#中串口讀取問題及解決方案

    C#中串口讀取問題及解決方案

    在現(xiàn)代計(jì)算機(jī)系統(tǒng)中,串口通信仍然是許多設(shè)備和應(yīng)用程序之間進(jìn)行數(shù)據(jù)交換的重要方式,無(wú)論是在工業(yè)自動(dòng)化、嵌入式系統(tǒng),還是在日常的硬件調(diào)試中,串口都扮演著不可或缺的角色,本文旨在深入探討C#中串口讀取問題的常見原因,并提供一系列有效的解決方案,需要的朋友可以參考下
    2024-12-12
  • C#用Lambda和委托實(shí)現(xiàn)模板方法

    C#用Lambda和委托實(shí)現(xiàn)模板方法

    C#用Lambda和委托實(shí)現(xiàn)模板方法,需要的朋友可以參考一下
    2013-03-03
  • C#實(shí)現(xiàn)線程安全的簡(jiǎn)易日志記錄方法

    C#實(shí)現(xiàn)線程安全的簡(jiǎn)易日志記錄方法

    這篇文章主要介紹了C#實(shí)現(xiàn)線程安全的簡(jiǎn)易日志記錄方法,比較實(shí)用的功能,需要的朋友可以參考下
    2014-08-08

最新評(píng)論

五莲县| 浦县| 舒城县| 张北县| 全州县| 沾益县| 临洮县| 波密县| 宣武区| 息烽县| 梓潼县| 宝鸡市| 永清县| 深水埗区| 镇江市| 临洮县| 临汾市| 鲁山县| 永吉县| 宁津县| 新蔡县| 夹江县| 房产| 宁化县| 高雄县| 睢宁县| 赣州市| 嘉禾县| 新野县| 临沧市| 高碑店市| 新余市| 武强县| 遵义市| 南澳县| 武汉市| 兴国县| 枞阳县| 固阳县| 理塘县| 资中县|