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相关推荐

  1. Ansible详解(二)

    Ansible系列命令 Ansible系列命令有如下: ansible:这个命令是日常工作中使用率非常高的命令之一,主要用于临时一次性操作: ansible-doc:是Ansible模块文档说明,针对 ...

  2. 深入理解 ValueTask

    .NET Framework 4 里面的命名空间为 System.Threading.Tasks的 Task 类.这个类以及它派生的 Task<TResult> 早已成为编程的主要部分,在 ...

  3. 持续畅销20年的《C#高级编程》出第11版了!

    TA是谁? Wrox精品红皮书, 引领无数程序员进入程序开发殿堂, C#专家级指南, 是经验丰富的程序员提高效率的更快捷方式,   连续畅销20年,累计销量超30万册. TA出生名门:  TA战绩辉煌 ...

  4. C#基础--异步编程

    文章目录 异步编程 历史 同步调用 异步模式 基于事件的异步模式 基于任务的异步模式 异步编程基础 创建任务 调用异步方法 使用 Awaiter 延续任务 同步上下文 使用多个异步方法 按顺序调用异步 ...

最新文章

  1. ARM CPU自动调度神经网络
  2. mysql galaxy_优化mysql
  3. Analysis of Web.xml in Hello1 project
  4. php用Simple Excel导出xls
  5. 如何系统性的分析一个新idea的可行性?
  6. NYOJ 594 还是A+B
  7. rust(29)-元组结构体
  8. dbus-glib-0.108 arm交叉编译
  9. 有趣的灵魂连墓碑都很酷! | 今日趣图
  10. 如何在asterisk中限制呼叫路数?
  11. Win7旗舰版系统开启硬盘ahci模式的方法
  12. 只显示小方格_魔力科学小实验 | 只能剪一刀,如何将图片中的红白方块分开?...
  13. vuex使用及自定义Vue指令vue-permission
  14. 管家婆请确认输入正确的服务器名,管家婆辉煌II软件登录提示连接失败请确认输入正确的服务器名...
  15. Visual Studio 2008 测试版 2 自述文件
  16. 大数据背景下谋划检务公开
  17. Fragment的onCreate和onCreateView区别
  18. 人工智能知识全面讲解:初识生成对抗网络
  19. linux中execve的用法,Linux 的 execve 函数
  20. 利用Python获取国内某天从某地到某地的所有航班;附在win10系统下安装Python第三方包的方式

热门文章

  1. 通过项目逐步深入了解Mybatis(四)
  2. Gradle实战:发布aar包到maven仓库
  3. php curl用法
  4. 数据可视化----我在寻找一款类似vfp或是access这样自带可视化风格的数据库或是键盘数据库...
  5. 蒙特卡洛方法_基本理论-蒙特卡洛方法与定积分
  6. IOS - UTF-8转码问题
  7. .net api 和java平台对接技术总结
  8. 3 Python os 文件和目录
  9. 如何查看服务器并发请求连接数
  10. 4.3.2 基于集合的操作