ValueTask<TResult> 结构

定义

提供包装 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> = struct
Public Structure ValueTask(Of TResult)
Implements IEquatable(Of ValueTask(Of TResult))

类型参数

TResult

结果。

继承
ValueTask<TResult>
实现
IEquatable<ValueTask<TResult>>

注解

ValueTask<TResult>实例可以等待或转换为 Task<TResult> usingAsTask。 实例 ValueTask<TResult> 只能等待一次,使用者在实例完成之前可能无法读取 Result 。 如果这些限制是不能接受的,请通过调用AsTask转换为 ValueTask<TResult> aTask<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方法,或者ValueTask<TResult>WhenAny必须首先转换为 Task<TResult> usingAsTask,从而导致在缓存在第一位置使用时避免Task<TResult>的分配。

因此,任何异步方法的默认选择应该是返回或 Task Task<TResult>。 仅当性能分析证明它值得使用时,才应该 ValueTask<TResult> 使用而不是 Task<TResult>使用。 对于大多数方案,不建议使用非泛型版本 ValueTaskCompletedTask当方法同步且成功返回时,该属性应用于回退成功完成的单一Task实例。

备注

ValueTask<TResult> C# 7.0 开始,此类型的使用不受任何版本的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> 值是否不相等。

适用于