C# 使用 ValueTasks

8daeba4961c4ed272c7fbd59e4e0d454.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());
    }
  }
}

技术群:添加小编微信并备注进群

小编微信:mm1552923   

公众号:dotNet编程大全 

往期推荐

·  C# 数据流

·  C# 类型系统

·  C# 面向对象的编程

·  C# 执行 SQL 语句

·  C# 连接数据库

·  C# 迭代器

e37af0468187dfc65f74742d6bf80633.png

Love life,love yourself

关注小编不迷路呦~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值