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>>public struct ValueTask<TResult> : IEquatable<System.Threading.Tasks.ValueTask<TResult>>type ValueTask<'Result> = structPublic Structure ValueTask(Of TResult)
Implements IEquatable(Of ValueTask(Of TResult))类型参数
- TResult
结果。
- 继承
- 实现
- 
		IEquatable<ValueTask<TResult>>
注解
ValueTask<TResult>实例可以等待,也可以使用 将其转换为 Task<TResult>AsTask。 一个 ValueTask<TResult> 实例只能等待一次,并且使用者在实例完成之前可能无法读取 Result 。 如果这些限制不可接受,请通过调用 AsTask将 Task<TResult> 转换为 ValueTask<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> ,ValueTask<TResult>则必须首先使用 AsTask将 Task<TResult> 转换为 ,从而导致在最初使用缓存Task<TResult>时会避免的分配。WhenAllWhenAny
因此,任何异步方法的默认选择应该是返回 Task 或 Task<TResult>。 仅当性能分析证明它值得时, ValueTask<TResult> 才应使用 而不是 Task<TResult>。 对于大多数方案,不建议使用 的非泛型版本 ValueTask 。 在 CompletedTask 返回 Task 的方法同步且成功完成的情况下,应使用 属性回退成功完成的单一实例。
注意
从 C# 7.0 开始,支持使用 ValueTask<TResult> 类型,并且不受任何版本的 Visual Basic 支持。
注意
使用无参数构造函数或由 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() | 检索表示此 ValueTask<TResult> 的 Task<TResult> 对象。 | 
| ConfigureAwait(Boolean) | 为此值配置一个 awaiter。 | 
| CreateAsyncMethodBuilder() | 创建方法生成器以使用异步方法。 | 
| 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> 值是否不相等。 |