C#怎么使用ValueTask C# ValueTask与Task性能对比

admin 百科 12
ValueTask 是 C# 7.0 引入的轻量级 struct,用于优化高频率、大概率同步完成的异步操作,避免 Task 的堆分配开销;适用于缓存命中、中间件等场景,但不可重复 await 或直接用于 Task 组合。

C#怎么使用ValueTask C# ValueTask与Task性能对比-第1张图片-佛山资讯网

ValueTask 是什么,什么时候该用它

ValueTask 是 C# 7.0 引入的轻量级结构体(struct),用来替代部分 Task 场景,避免不必要的堆分配。它内部可以包装一个 Task(异步未完成时)或直接保存同步结果(如 TResultvoid)。本质是“可选堆分配”的异步操作容器。

适合用 ValueTask 的典型场景:

  • 方法大概率同步完成(比如缓存命中、内存数据快速返回)
  • 被高频调用(如 ASP.NET Core 中间件、序列化器、基础工具方法)
  • 不需多次 await(ValueTask 不可重复 await,重复调用会抛异常)
  • 不需作为 Task 对象传递给其他 API(比如不能传给 Task.WhenAll,得先 .AsTask()

怎么正确使用 ValueTask

声明和返回很简单,但要注意约束:

  • 方法签名用 ValueTask<t></t>ValueTask(对应 void)
  • 同步路径直接 return new ValueTask(value),不 new Task
  • 异步路径用 await 普通 async 方法,编译器自动构造 ValueTask
  • 需要转成 Task 时调用 .AsTask()(仅在必须兼容 Task API 时才做)

示例:

public ValueTask<string> ReadAsync()
{
    if (_cache != null) // 同步命中
        return new ValueTask<string>(_cache);
<pre class='brush:php;toolbar:false;'>return ReadFromNetworkAsync(); // 真正 async 方法,返回 ValueTask<string>

登录后复制

}

private async ValueTask ReadFromNetworkAsync() { await Task.Delay(100); // 模拟 I/O return "data"; }

ValueTask 和 Task 性能差异在哪

核心区别在内存分配

标签: js json 工具 ai 路由 区别 c# .net

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~