次の方法で共有


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>、待機するか、 を使用して AsTaskTask<TResult>変換できます。 インスタンスは ValueTask<TResult> 1 回だけ待機でき、コンシューマーはインスタンスが完了するまで読み取 Result られません。 これらの制限が許容できない場合は、 を 呼び出AsTaskして を ValueTask<TResult>Task<TResult> に変換します。

インスタンスに対して次の操作を ValueTask<TResult> 実行しないでください。

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

上記のいずれかを実行すると、結果は未定義になります。

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

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

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

そのため、非同期メソッドの既定の選択肢は、 または Task<TResult>を返すTask必要があります。 パフォーマンス分析で それが価値があると証明された場合にのみ、 ではなく Task<TResult>ValueTask<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> 値が等しくないかどうかを判断します。

適用対象