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

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

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

前言

最近在閱讀 .NET Threadpool starvation, and how queuing makes it worse 這篇博文時發(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 簡單來說就是創(chuàng)建時就已經(jīng)完成的 Task ,或者說執(zhí)行時間為0的 Task ,或者說是空任務(wù),也就是在創(chuàng)建時就將 Task 的 IsCompeted 值設(shè)置為0。

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

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

這樣做有什么好處呢?

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

結(jié)

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

相關(guān)文章

  • C# 排序算法之堆排序

    C# 排序算法之堆排序

    這里是指一種數(shù)據(jù)結(jié)構(gòu),而不是我們在C#中提到的用于存儲引用類型對象的地方。它可以被當(dāng)成一棵完全二叉樹。
    2010-09-09
  • C#串口通信工具類的封裝

    C#串口通信工具類的封裝

    這篇文章主要為大家詳細(xì)介紹了C#串口通信工具類封裝,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C#實(shí)現(xiàn)的海盜分金算法實(shí)例

    C#實(shí)現(xiàn)的海盜分金算法實(shí)例

    這篇文章主要介紹了C#實(shí)現(xiàn)的海盜分金算法,結(jié)合具體實(shí)例形式分析了海盜分金算法的原理與C#相應(yīng)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-07-07
  • C#多線程系列之線程等待

    C#多線程系列之線程等待

    本文詳細(xì)講解了C#多線程中的線程等待,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • C#中實(shí)現(xiàn)查找mysql的安裝路徑

    C#中實(shí)現(xiàn)查找mysql的安裝路徑

    這篇文章主要介紹了C#中實(shí)現(xiàn)查找mysql的安裝路徑,本文講解使用SQL語句查詢出mysql的安裝路徑,方便在備份時使用,需要的朋友可以參考下
    2015-06-06
  • C# PDF轉(zhuǎn)圖片(JPG,Png)的項(xiàng)目實(shí)踐

    C# PDF轉(zhuǎn)圖片(JPG,Png)的項(xiàng)目實(shí)踐

    本文主要介紹了C# PDF轉(zhuǎn)圖片(JPG,Png)的項(xiàng)目實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C# 快速高效率復(fù)制對象(表達(dá)式樹)

    C# 快速高效率復(fù)制對象(表達(dá)式樹)

    在代碼中經(jīng)常會遇到需要把對象復(fù)制一遍,或者把屬性名相同的值復(fù)制一遍。本文將對其解決方法進(jìn)行詳細(xì)介紹。下面跟著小編一起來看下吧
    2017-04-04
  • WindowsForm移動一個沒有標(biāo)題欄的窗口的方法

    WindowsForm移動一個沒有標(biāo)題欄的窗口的方法

    這篇文章主要介紹了WindowsForm移動一個沒有標(biāo)題欄的窗口的方法,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • 用 C# 編寫一個停放在任務(wù)欄上的圖標(biāo)程序

    用 C# 編寫一個停放在任務(wù)欄上的圖標(biāo)程序

    用 C# 編寫一個停放在任務(wù)欄上的圖標(biāo)程序...
    2007-03-03
  • C#調(diào)用CMD命令實(shí)例

    C#調(diào)用CMD命令實(shí)例

    這篇文章主要介紹了C#調(diào)用CMD命令實(shí)例本文只是給出一個比較簡單的、入門級的例子,更多高級的操作技巧請參閱相關(guān)文章,需要的朋友可以參考下
    2014-08-08

最新評論