ValueTask<TResult> 構造体

定義

Task<TResult>TResultをラップする値型を提供します。そのうちの 1 つだけが使用されます。

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

結果。

継承
ValueTask<TResult>
実装
IEquatable<ValueTask<TResult>>

注釈

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

次の操作は、 ValueTask<TResult> インスタンスで実行しないでください。

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

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

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

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

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

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

Note

ValueTask<TResult> 型の使用は C# 7.0 以降でサポートされており、どのバージョンの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()

このValueTask<TResult>を表すTask<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>)

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

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

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

適用対象