日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > C# >内容正文

C#

C#中await/async闲说

發(fā)布時(shí)間:2023/12/4 C# 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#中await/async闲说 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

自從C#5.0增加異步編程之后,異步編程越來(lái)越簡(jiǎn)單,async和await用的地方越來(lái)越多,越來(lái)越好用,只要用異步的地方都是一連串的異步,如果想要異步編程的時(shí)候,需要從底層開(kāi)始編寫(xiě),這樣后邊使用的時(shí)候就是異步,那么底層是如何實(shí)現(xiàn)??我們?nèi)绾尉帉?xiě)高效率的異步方法??

#了解基于任務(wù)的異步模式(TAP)

基于任務(wù)的異步編程模型 (TAP) 提供了異步代碼的抽象化,你只需像往常一樣將代碼編寫(xiě)為一連串語(yǔ)句即可,在開(kāi)始調(diào)用的地方運(yùn)行。例如:var task = method()①; await task②; 在①的時(shí)候開(kāi)始運(yùn)行可能還沒(méi)有運(yùn)行完,在②程序掛起等待運(yùn)行完,中間怎么運(yùn)行的你不需要知道,編譯器會(huì)做若干操作的。當(dāng)開(kāi)啟多個(gè)任務(wù)的時(shí)候,像要他們都執(zhí)行完,在執(zhí)行其他的時(shí)候,可以await Task.WhenAll(task1,task2 .....);

#了解async/await

await 運(yùn)算符應(yīng)用于異步方法,在方法的執(zhí)行中插入掛起點(diǎn),直到所等待任務(wù)完成。使用async 和await定義異步方法不一定會(huì)創(chuàng)建新線(xiàn)程,當(dāng)編譯器看到await關(guān)鍵字時(shí),線(xiàn)程會(huì)掛起等待運(yùn)行結(jié)束。
await 僅可用于由 async 關(guān)鍵字修改的異步方法中,使用 async 修飾符定義的方法通常包含一個(gè)或多個(gè) await 表達(dá)式,使用await運(yùn)算符的任務(wù)通常是實(shí)現(xiàn)[基于任務(wù)的異步模式(TAP)]的方法調(diào)用返回,返回值包括 Task、Task<TResult>、ValueTask 和 ValueTask<TResult> 對(duì)象的方法。

# 調(diào)用 Task.Wait() 或者 Task.Result 立刻產(chǎn)生死鎖的充分條件

1. 調(diào)用 Wait() 或 Result 的代碼位于 UI 線(xiàn)程。
2. Task 的實(shí)際執(zhí)行在其他線(xiàn)程,且需要返回 UI 線(xiàn)程。
死鎖的原因:UWP、WPF、Windows Forms 程序的 UI 線(xiàn)程都是單線(xiàn)程的。為了避免產(chǎn)生死鎖,你應(yīng)該一條道走到黑, Async All the Way?;蛘?ConfigureAwait(false)

# ValueTask與Task的區(qū)別

7.0為async新增的ValueTask的作用(如果沒(méi)有在Nuget上下載System.Threading.Tasks.Extensions,ValueTask就在這個(gè)庫(kù)中),ValueTask用于值類(lèi)型的異步;Task為引用類(lèi)型的,每次需要分配空間。
例如:

當(dāng)a,b=0的時(shí)候不會(huì)運(yùn)行到task里,這個(gè)時(shí)候返回task就造成了資源的浪費(fèi),修改為以下會(huì)效率更高

但是也不是說(shuō)到處用ValueTask會(huì)好,當(dāng)是引用類(lèi)型的時(shí)候,用ValueTask,你需要關(guān)注更多的數(shù)據(jù),這個(gè)時(shí)候用Task會(huì)更好。

# await/async原理分析

對(duì)Start方法進(jìn)行分析,可以看出MoveNext,程序的運(yùn)行其實(shí)還是一步一步進(jìn)行的,那么await/async會(huì)不會(huì)創(chuàng)建一個(gè)線(xiàn)程,這倒是不一定,這個(gè)由線(xiàn)程池決定,那么異步了不創(chuàng)建一個(gè)線(xiàn)程,怎么異步的,這里的異步可能是運(yùn)行在已經(jīng)有的線(xiàn)程上。

原文地址:https://www.cnblogs.com/zhao123/p/11078382.html

總結(jié)

以上是生活随笔為你收集整理的C#中await/async闲说的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。