ValueTask<TResult> 構造体

定義

Task<TResult>TResult をラップする値の型を提供します。使用するのは一方だけです。

generic <typename TResult>
public value class ValueTask : 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> することができます AsTask 。 インスタンス ValueTask<TResult> は 1 回だけ待つ場合があります。コンシューマーは、インスタンスが完了するまで Result 読み取りを行う必要があります。 これらの制限を許容できない場合は、 を呼び出して、 を ValueTask<TResult>Task<TResult> 変換します AsTask

インスタンスに対して次の操作を実行 ValueTask<TResult> する必要があります。

  • インスタンスを複数回待っています。
  • 複数回呼 AsTask び出す。
  • 操作がまだ完了していない場合や、操作を複数回使用する場合は、 .Result .GetAwaiter().GetResult() または を使用します。
  • これらの手法の 1 つ以上を使用して、 インスタンスを使用します。

上記の操作を行った場合、結果は未定義になります。

メソッドは、操作の結果が同期的に使用できる可能性が高く、呼び出しごとに新しい を割り当てるコストが非常に高い頻度で呼び出されると予想される場合に、この値型のインスタンスを返す可能性があります。 Task<TResult>

の代わりに を使用する ValueTask<TResult> 場合のトレードオフがあります Task<TResult> 。 たとえば、 は、成功した結果が同期的に使用できる場合に割り当てを回避するのに役立ちますが、参照型としての は 1 つのフィールドであるのに対し、複数のフィールドも含まれます ValueTask<TResult> Task<TResult> 。 つまり、 メソッドから を ValueTask<TResult> 返した場合、より多くのデータがコピーされます。 また、非同期メソッド内で を返すメソッドが待っている場合、1 つの参照ではなく複数のフィールドを含む構造体を格納する必要があるという理由で、その非同期メソッドのステート マシンは大きくなります。 ValueTask<TResult>

await を使用した非同期操作の結果を使用する以外の用途では、 により多くの割り当てを必要とするより複雑なプログラミング モデル ValueTask<TResult> が発生する可能性があります。 たとえば、キャッシュされたタスクを含む を一般的な結果として返すメソッドや、 を返す Task<TResult> メソッドを考えてみとします ValueTask<TResult> 。 結果のコンシューマーが や などのメソッドで として使用する場合は、最初に を使用して に変換する必要があります。その結果、キャッシュされた が最初に使用されている場合に回避される割り当てになります。 Task<TResult> WhenAll WhenAny ValueTask<TResult> Task<TResult> AsTask Task<TResult>

そのため、非同期メソッドの既定の選択肢は、 または を返す Task 必要があります Task<TResult> 。 パフォーマンス分析によって価値があると証明された場合にのみ、 ではなく ValueTask<TResult> を使用する必要があります Task<TResult> 。 の非ジェネリック バージョン ValueTask は、ほとんどのシナリオでは推奨されません。 を返すメソッドが同期的に正常に完了した場合は、 プロパティを使用して、正常に完了したシングルトン CompletedTask 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>)

2 つの値が等しいかどうかを比較します。

Inequality(ValueTask<TResult>, ValueTask<TResult>)

2 つの ValueTask<TResult> 値が等しくないかどうかを判断します。

適用対象