简介
ValueTask 是 .NET Core 2.0+ 引入的高性能异步操作类型,用于优化可能同步完成的异步操作,减少内存分配和性能开销。
为什么需要 ValueTask?
Task 的性能问题
-
堆分配开销:每次创建
Task<T>都会在堆上分配对象(约 1KB),高频调用会导致GC压力。 -
多数场景同步完成:许多异步方法在多数情况下可以直接返回结果,无需真正异步。
ValueTask 的优势
-
值类型:
ValueTask<T>是struct,避免堆分配。 -
双重表示:
-
直接存储同步结果(无需分配)。
-
包装真正的
Task<T>(当确实需要异步时)。
-
ValueTask本质
public readonly struct ValueTask<TResult> : IEquatable<ValueTask<TResult>>
{
private readonly object? _obj; // Task或IValueTaskSource
private readonly TResult _result; // 同步结果
private readonly short _token; // 验证令牌
// ...
}
典型使用场景
-
同步完成概率高
-
缓存命中、预加载数据、简单计算等。
-
示例:从缓存读取数据,命中时同步返回。
-
-
高频调用的异步方法
-
如网络库、序列化、中间件等底层组件。
-
避免大量
Task分配导致的GC压力。
-
-
热路径(
Hot Path)优化- 性能关键的代码段(如循环内调用)。
核心使用场景
高频调用且多数情况同步完成的方法
// 缓存场景:多数情况直接命中缓存(同步)
public ValueTask<string> GetDataAsync(string key)
{
if (_cache.TryGetValue(key, out string value))
{
return new ValueTask<string>(value); // 同步返回,无堆分配
}
return new ValueTask<string>(LoadDataFromDbAsync(key)); // 异步返回
}
实现异步接口或基类方法
// 实现异步接口时,优先使用 ValueTask
public interface IDataProvider
{
ValueTask<string> GetDataAsync(string key);
}
异步流中的值返回
// 异步流中的值生成
public async IAsyncEnumerable<ValueTask<int>> GenerateValuesAsync()
{
for (int i = 0

最低0.47元/天 解锁文章
1096

被折叠的 条评论
为什么被折叠?



