麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > C# > 正文

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

2019-10-29 19:58:04
字體:
來源:轉載
供稿:網友

前言

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

這種從未見過的用法就是下面代碼中的 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();}

注:上面的代碼不是示例,只是因為這段代碼而初遇 await Task.Yield

Task.Yield 簡單來說就是創建時就已經完成的 Task ,或者說執行時間為0的 Task ,或者說是空任務,也就是在創建時就將 Task 的 IsCompeted 值設置為0。

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

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

這樣做有什么好處呢?

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

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 国产精品999在线观看 | 一级毛片手机在线观看 | 中文字幕免费在线观看视频 | 热99re久久免费视精品频软件 | 在线看一区二区三区 | 九九热视频在线免费观看 | 日韩大片在线永久观看视频网站免费 | 怦然心动50免费完整版 | 51国产偷自视频区视频小蝌蚪 | 久久新网址 | 青青草在线免费观看 | 羞羞视频免费入口网站 | 国产99视频精品免视看9 | 中国女警察一级毛片视频 | 日本欧美视频 | 久久久av亚洲男天堂 | 精品国产乱码久久久久久丨区2区 | 成人福利在线看 | 国产欧美精品综合一区 | 姑娘第四集免费看视频 | 2021免费日韩视频网 | 中文字幕一区久久 | 久久久久久久久久久久久久久伊免 | 色999国产| 精品国产一区二区三区四区阿崩 | 国产三级在线观看a | 亚州精品天堂中文字幕 | 国产在线精品一区二区夜色 | 免费啪视频在线观看 | 久久久久久免费 | 看一级毛片 | 久久久精品99 | 精品一区二区免费 | 国产亚洲精品久久久久久网站 | 91精品国产91久久久久久丝袜 | 久久精品99国产国产精 | 广州毛片| 欧美精品毛片 | free korean xxxxhd | 毛片视频在线免费观看 | 精品在线观看一区二区 |