ValueTask<TResult> 结构
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
提供一个值类型,用于包装一个 Task<TResult> 和一个 TResult,只使用其中一个。
generic <typename TResult>
public value class ValueTask : IEquatable<System::Threading::Tasks::ValueTask<TResult>>
public readonly struct ValueTask<TResult> : IEquatable<System.Threading.Tasks.ValueTask<TResult>>
type ValueTask<'Result> = struct
Public Structure ValueTask(Of TResult)
Implements IEquatable(Of ValueTask(Of TResult))
类型参数
- TResult
结果。
- 继承
- 实现
-
IEquatable<ValueTask<TResult>>
注解
ValueTask<TResult>实例可以等待或转换为 Task<TResult> using AsTask。 一个 ValueTask<TResult> 实例只能等待一次,并且使用者在实例完成之前可能不会读取 Result 。 如果这些限制是不能接受的,请通过调用AsTask将其转换为 。ValueTask<TResult>Task<TResult>
不应对 ValueTask<TResult> 实例执行以下操作:
- 等待实例多次。
- 多次调用 AsTask 。
- 使用
.Result或.GetAwaiter().GetResult()操作尚未完成或多次使用。 - 使用这些技术中的多个技术来使用实例。
如果执行上述任一操作,则结果未定义。
如果方法可能同步提供其操作结果,并且预期调用频率如此频繁,则此方法可能会返回此值类型的实例,以便每次调用分配新 Task<TResult> 项的成本将令人望而却步。
使用 ValueTask<TResult> 替代 Task<TResult>方法有利弊。 例如,虽然在成功结果同步可用的情况下,一个 ValueTask<TResult> 可以帮助避免分配,但它也包含多个字段,而 Task<TResult> 作为引用类型是单个字段。 这意味着从方法返回一个 ValueTask<TResult> 会导致复制更多数据。 这也意味着,如果返回某个 ValueTask<TResult> 方法的方法在异步方法中等待,则异步方法的状态机将更大,因为它必须存储包含多个字段而不是单个引用的结构。
对于使用 await 的异步操作结果以外的用途, ValueTask<TResult> 可能会导致需要更多分配的卷积编程模型。 例如,请考虑一个方法,该方法可以返回 Task<TResult> 具有缓存任务作为常见结果或 ValueTask<TResult>. 如果结果的使用者希望将其用作 Task<TResult> 方法 WhenAll ,或者 WhenAny, ValueTask<TResult> 必须先将其转换为 Task<TResult> using AsTask,从而导致在首先使用缓存 Task<TResult> 时避免的分配。
因此,任何异步方法的默认选择应该是返回或 TaskTask<TResult>。 仅当性能分析证明值得使用时,才应 ValueTask<TResult> 使用而不是 Task<TResult>使用。 对于大多数方案,不建议使用非泛型版本 ValueTask 。 CompletedTask当方法同步且成功返回Task时,该属性应用于回退成功完成的单一实例。
Note
从 C# 7.0 开始,支持使用 ValueTask<TResult> 类型,并且不受任何版本的Visual Basic支持。
Note
使用无参数构造函数或 default(ValueTask<TResult>) 语法(零初始化结构)创建的实例表示具有结果 default(TResult)的同步、成功完成的操作。
构造函数
| 名称 | 说明 |
|---|---|
| ValueTask<TResult>(IValueTaskSource<TResult>, Int16) |
使用IValueTaskSource<TResult>表示操作的对象初始化类的新实例ValueTask<TResult>。 |
| ValueTask<TResult>(Task<TResult>) |
使用表示操作的提供的任务初始化类的新实例 ValueTask<TResult> 。 |
| ValueTask<TResult>(TResult) |
使用成功操作提供的结果初始化类的新实例 ValueTask<TResult> 。 |
属性
| 名称 | 说明 |
|---|---|
| IsCanceled |
获取一个值,该值指示此对象是否表示已取消的操作。 |
| IsCompleted |
获取一个值,该值指示此对象是否表示已完成的操作。 |
| IsCompletedSuccessfully |
获取一个值,该值指示此对象是否表示成功完成的操作。 |
| IsFaulted |
获取一个值,该值指示此对象是否表示失败的操作。 |
| Result |
获取结果。 |
方法
| 名称 | 说明 |
|---|---|
| AsTask() |
检索一个 Task<TResult> 表示此 ValueTask<TResult>对象的对象。 |
| ConfigureAwait(Boolean) |
为此值配置 awaiter。 |
| Equals(Object) |
确定指定的对象是否等于当前对象。 |
| Equals(ValueTask<TResult>) |
确定指定的 ValueTask<TResult> 对象是否等于当前 ValueTask<TResult> 对象。 |
| GetAwaiter() |
为此值创建 awaiter。 |
| GetHashCode() |
返回此实例的哈希代码。 |
| Preserve() |
获取一个 ValueTask<TResult> 可在将来的任何时刻使用。 |
| ToString() |
返回一个表示当前对象的字符串。 |
运营商
| 名称 | 说明 |
|---|---|
| Equality(ValueTask<TResult>, ValueTask<TResult>) |
比较两个相等值。 |
| Inequality(ValueTask<TResult>, ValueTask<TResult>) |
确定两 ValueTask<TResult> 个值是否不相等。 |