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

ValueTask 是 C# 7.0 引入的轻量级结构体(struct),用来替代部分 Task 场景,避免不必要的堆分配。它内部可以包装一个 Task(异步未完成时)或直接保存同步结果(如 TResult 或 void)。本质是“可选堆分配”的异步操作容器。
适合用 ValueTask 的典型场景:
Task.WhenAll,得先 .AsTask())声明和返回很简单,但要注意约束:
ValueTask<t></t> 或 ValueTask(对应 void)await 普通 async 方法,编译器自动构造 ValueTask.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
核心区别在内存分配:
实际性能提升取决于使用模式:
别只看微基准——高吞吐服务(如 JSON 序列化、路由匹配)中,把关键路径从 Task 改成 ValueTask,常能降低 Gen0 GC 次数 10%+。
滥用反而有害:
WhenAll、WhenAny、ContinueWith)→ 必须先 .AsTask(),失去优势一句话:ValueTask 是性能优化手段,不是 Task 的通用替代品。
基本上就这些。用对地方能省点分配,用错地方反而添麻烦。
以上就是C#怎么使用ValueTask C# ValueTask与Task性能对比的详细内容,更多请关注php中文网其它相关文章!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号