产品网站建设多少钱,做网站要注册商标,郑州优化网站推广,北京企业网站模板建站开发C# 7 带有更灵活的 await 关键字#xff1b;它现在可以等待任何提供 GetAwaiter 方法的对象。一种可用于等待的新类型是 ValueTask。与 Task 类相反#xff0c;ValueTask 是一个结构。这具有性能优势#xff0c;因为 ValueTask 在堆上没有对象。与异步方法调用相比#xff… C# 7 带有更灵活的 await 关键字它现在可以等待任何提供 GetAwaiter 方法的对象。一种可用于等待的新类型是 ValueTask。与 Task 类相反ValueTask 是一个结构。这具有性能优势因为 ValueTask 在堆上没有对象。与异步方法调用相比Task 对象的实际开销是多少需要异步调用的方法通常比堆上的对象有更多的开销。大多数时候堆上 Task 对象的开销是可以忽略的但并不总是这样。例如某方法可以有一个路径其中数据是从一个具有异步 API 的服务中检索出来的。通过这种数据检索数据就写入到本地缓存中。第二次调用该方法时可以以快速的方式检索数据而不需要创建 Task 对象。示例方法 GreetingValueTaskAsync 正是这样做的。如果该名称已存在于字典中则结果返回为 ValueTask。如果名称不在字典中将调用 GreetingAsync 方法该方法返回一个 Task。在此任务中等待检索结果时将再次返回 ValueTaskprivate readonly static Dictionarystring, string names new Dictionarystring, string();
static async ValueTaskstring 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 ValueTaskstring GreetingValueTask2Async(string name)
{if(names.TryGetValue(name, out string result)){return new ValueTaskstring(result);}else{Taskstring tl GreetingAsync(name);TaskAwaiterstring awaiter tl.GetAwaiter();awaiter.OnCompleted(OnCompletion); return new ValueTaskstring(t1):void OnCompletion(){namea.Add(name, awaiter.GetResult());}}
}往期推荐· C# 数据流· C# 类型系统· C# 面向对象的编程· C# 执行 SQL 语句· C# 连接数据库· C# 迭代器Love life,love yourself关注小编不迷路呦~