C# 使用 ValueTasks
C# 7 帶有更靈活的 await 關鍵字;它現在可以等待任何提供 GetAwaiter 方法的對象。一種可用于等待的新類型是 ValueTask。與 Task 類相反,ValueTask 是一個結構。這具有性能優勢,因為 ValueTask 在堆上沒有對象。
與異步方法調用相比,Task 對象的實際開銷是多少?需要異步調用的方法通常比堆上的對象有更多的開銷。大多數時候,堆上 Task 對象的開銷是可以忽略的,但并不總是這樣。例如,某方法可以有一個路徑,其中數據是從一個具有異步 API 的服務中檢索出來的。通過這種數據檢索,數據就寫入到本地緩存中。第二次調用該方法時,可以以快速的方式檢索數據,而不需要創建 Task 對象。
示例方法 GreetingValueTaskAsync 正是這樣做的。如果該名稱已存在于字典中,則結果返回為 ValueTask。如果名稱不在字典中,將調用 GreetingAsync 方法,該方法返回一個 Task。在此任務中等待檢索結果時,將再次返回 ValueTask:
private?readonly?static?Dictionary<string, string> names =?new?Dictionary<string, string>(); static?async?ValueTask<string> GreetingValueTaskAsync(string?name) {if (names.TryGetValue(name, out string result)){return result;}else{result = await GreetingAsync(name);names.Add(name,?result);?return?result;}} }UseValueTask 方法使用相同的名稱調用 GreetingValueTaskAsync 方法兩次。第一次使用 GreetingAsync 方法檢索數據;第二次,數據在字典中找到并從那里返回:
private static async void UseValueTask() {string result = await GreetingValueTaskAsync("Katharina"); Console.WriteLine(result);string result2 = await GreetingValueTaskAsync("Katharina"); Console.WriteLine(result2); }如果方法不使用 async 修飾符,而需要返回 ValueTask,就可以使用傳遞結果或者傳遞 Task 對象的構造函數創建 ValueTask 對象:
static?ValueTask<string> GreetingValueTask2Async(string?name) {if(names.TryGetValue(name, out string result)){return?new?ValueTask<string>(result);}else{Task<string>?tl =?GreetingAsync(name);TaskAwaiter<string>?awaiter =?tl.GetAwaiter();awaiter.OnCompleted(OnCompletion);?return?new?ValueTask<string>(t1):void OnCompletion(){namea.Add(name, awaiter.GetResult());}} }往期推薦
·??C# 數據流
·??C# 類型系統
·??C# 面向對象的編程
·??C# 執行 SQL 語句
·??C# 連接數據庫
·??C# 迭代器
Love life,love yourself
關注小編不迷路呦~
總結
以上是生活随笔為你收集整理的C# 使用 ValueTasks的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Asp-Net-Core开发笔记:在do
- 下一篇: NET框架下如何使用PaddleOCRS