C# 使用 ValueTasks

c33ed62dbb3fb3d67b293f03f177026f.png

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# 迭代器

7c9b1f0fa9b7345dba651e05e00792db.png

Love life,love yourself

关注小编不迷路呦~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/291310.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Electron - 创建跨平台的桌面客户的应用程序

Electron 框架的前身是 Atom Shell&#xff0c;可以让你写使用 JavaScript&#xff0c;HTML 和 CSS 构建跨平台的桌面应用程序。它是基于io.js 和 Chromium 开源项目&#xff0c;并用于在 Atom 编辑器中。Electron 是开源的&#xff0c;由 GitHub 维护&#xff0c;有一个活跃的…

Cognos TM1_10.1.1服务端配置

场景&#xff1a;本文继Cognos TM1_10.1.1服务端安装 之后&#xff0c;简单的说一下本人对简单配置的拙见,确保服务端在安装过程一切正常&#xff0c;成功安装。 1&#xff1a;进入TM的Cognos Configuration 2&#xff1a;如下图&#xff0c;选中环境&#xff0c;这里可以看出…

java黄油刀_一篇文章玩转ButterKnife,让代码更简洁

前言话说&#xff0c;Android开发的兄弟们都知道&#xff0c;每次初始化控件&#xff0c;设置相应的事件&#xff0c;写的那点过程多而且恶心。我们先一块回顾下不堪的曾经~那些年&#xff0c;我们是这样初始化控件&#xff1a;// 每次的习惯上来写一个initView()方法tvContent…

nodejs的内存管理,垃圾回收机制

2019独角兽企业重金招聘Python工程师标准>>> 要点记录&#xff1a; 1、网页js、命令行工具&#xff0c;快进快出的&#xff0c;即时内存泄露&#xff0c;无内存管理必要! 2、服务器端nodejs和其他正规语言一样存在内存泄露。 3、nodejs基于谷歌v8js引擎&#xff…

Redis【第二篇】集群搭建

第一步&#xff1a;准备 1.安装包 ruby-2.4.0.tar.gz rubygems-2.6.10.tgz zlib-1.2.11.tar.gz redis-3.3.2.gem 2. 架构&#xff1a; 名称IP端口节点属性redisA192.168.6.1286379主节点redisB192.168.6.1289379从节点redisC192.168.6.1296379主节点redisD192.168.6.1299379从节…

(转)java中对集合对象list的几种循环访问总结

Java集合的Stack、Queue、Map的遍历在集合操作中&#xff0c;常常离不开对集合的遍历&#xff0c;对集合遍历一般来说一个foreach就搞定了&#xff0c;但是&#xff0c;对于Stack、Queue、Map类型的遍历&#xff0c;还是有一些讲究的。最近看了一些代码&#xff0c;在便利Map时…

NET框架下如何使用PaddleOCRSharp

打开VSIDE,新建Windows窗体应用(.NETFramework)类型的项目&#xff0c;选择一个.NET框架&#xff0c;如.NETFramework 4.0&#xff0c;右键点击项目&#xff0c;选择属性》生成&#xff0c;目标平台设置成X64.菜单》工具》选项&#xff0c;Nuget包管理器》程序包管理&#xff0…

Redis主从复制(Master-Slave Replication)

案例测试&#xff1a;1. Master新增网卡&#xff0c;修改server端配置IP : 192.168.40.128/24注释&#xff1a; bind&#xff0c;支持网络连接2. 新建虚机slave&#xff0c;配置网络&#xff0c;修改redis配置#slaveof <masterip> <masterport>slaveof 192.168.40.…

如何对一组 IP 地址 进行排序?

咨询区 Cracker我有一组如下IP地址。192.168.1.5 69.52.220.44 10.152.16.23 192.168.3.10 192.168.1.4 192.168.2.1我在寻找一个方法将他们排序成如下顺序。10.152.16.23 69.52.220.44 192.168.1.4 192.168.1.5 192.168.2.1回答区 Alex Aza对 ip 地址进行排序&#xff0c;大概…

如何为APK签名?

1.用来生成应用签名的文件①默认: debug.keystore > debug签名的应用程序不能在Android Market上架销售&#xff0c;它会强制你使用自己的签名。> 不同电脑使用此文件生成的签名不一样。那就意味着如果你换了机器进行apk版本升级&#xff0c;那么将会出现上面那种程序不能…

基于 Azure 的认知服务将文本合成语音

基于 Azure 的认知服务将文本合成语音Intro前几天发了一个 .NET 20 周年祝福视频&#xff0c;语音是通过 Azure 的认知服务合成的&#xff0c;下面就来介绍一下如何将使用 Azure 的认识服务实现将文本合成为语音Prepare你可以在 Azure Portal 上创建一个免费的语音服务&#xf…

sql查询结果集根据指定条件排序的方法

oracle认为 null 最大。 升序排列&#xff0c;默认情况下&#xff0c;null值排后面。 降序排序&#xff0c;默认情况下&#xff0c;null值排前面。 有几种办法改变这种情况&#xff1a; &#xff08;1&#xff09;用 nvl 函数或decode 函数 将null转换为一特定值 &#xff08;2…

mysql怎么改字体编码_mysql怎么改字符编码?

mysql命令行修改字符编码1、修改数据库字符编码mysql> alter database mydb character set utf8 ;2、创建数据库时&#xff0c;指定数据库的字符编码mysql> create database mydb character set utf8 ;3、查看mysql数据库的字符编码mysql> show variables like charac…

如何编译 dotnet/runtime 源代码

前言最近&#xff0c;准备为 dotnet/runtime 修改 issue&#xff0c;但是在 clone 代码后&#xff0c;发现要编译成功&#xff0c;远没有想象中那么容易。因此&#xff0c;将整个过程进行记录&#xff0c;以供大家参考。以下操作都是在 Windows 10 下完成。0.环境准备详见官方文…

jenkins maven testng selenium自动化持续集成

准备环境 首先我们新建一个maven的工程&#xff0c;并且在pom.xml中配置好我们依赖的一些jar包 <dependencies><dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>2.46.0<…

java程序 开发工具_15款Java程序员必备的开发工具

如果你是一名Web开发人员&#xff0c;那么用膝盖想也知道你的职业生涯大部分将使用Java而度过。这是一款商业级的编程语言&#xff0c;我们没有办法不接触它。对于Java&#xff0c;有两种截然不同的观点&#xff1a;一种认为Java是最简单功能***大的编程语言之一&#xff0c;另…

SQLite编译问题

从http://www.sqlite.org/主页上获得了SQLite的源文件&#xff0c;还没有时间研究就在编译上发生了不小的问题。 首先是碰到是&#xff0c;编译之后&#xff0c;只产生了sqlite3.dll文件&#xff0c;不产生对应的lib库文件。 查看了下sqlite3.h代码&#xff0c;发现了SQLITE_AP…

mysql的调试与分析_mysql日志管理分析调试实例_MySQL

以下的文章主要介绍的是MySQL 操作日志查看的实际操作步骤以及对其实际操作步骤的具体描述&#xff0c;假如你在实际操作中遇到相似的情况&#xff0c;但是你却不知道对其如何正确的解决&#xff0c;那么以下的文章对你而言一定是良师益友。刚接触MySQL不久&#xff0c;发现缺少…

.NET 7 预览版 1 发布

宣布 .NET 7 预览版 1Jeremy 2022 年 2 月 17 日今天&#xff0c;我们很高兴地宣布 .NET 历史上的下一个里程碑。在庆祝社区和 20 年创新的同时&#xff0c;.NET 7 Preview 1 标志着迈向 .NET 下一个 20 年的第一步。ASP.NET Core Preview 1 和 EF7 Preview 1 也在今天发布。.N…

你一写长文章就焦虑拖延?

这是病&#xff0c;得治。 症状 每年春季学期&#xff0c;总会有一些人很烦躁。 别人晒朋友圈&#xff0c;他留言说不中听的话&#xff1b;你见他突然妄自菲薄&#xff0c;开导劝慰他&#xff0c;却被辩驳甚至骂一通&#xff1b;一点儿小事儿&#xff0c;都能激起他胸中的愤怒&…