ValueTask<TResult> ValueTask<TResult> ValueTask<TResult> ValueTask<TResult> Struct


Task<TResult>TResult をラップする値の型を提供します。使用するのは一方だけです。Provides a value type that wraps a Task<TResult> and a TResult, only one of which is used.

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))



結果。The result.



AValueTask<TResult>インスタンスが待機するかに変換するTask<TResult>を使用してAsTaskします。A ValueTask<TResult> instance may either be awaited or converted to a Task<TResult> using AsTask. AValueTask<TResult>インスタンスは 1 回、待機のみとコンシューマーは呼び出すことができませんGetAwaiter()インスタンスが完了するまでです。A ValueTask<TResult> instance may only be awaited once, and consumers may not call GetAwaiter() until the instance has completed. これらの制限が許容されない場合は、変換、ValueTask<TResult>Task<TResult>呼び出してAsTaskします。If these limitations are unacceptable, convert the ValueTask<TResult> to a Task<TResult> by calling AsTask.

次の操作を実行しない必要があります、ValueTask<TResult>インスタンス。The following operations should never be performed on a ValueTask<TResult> instance:

  • 複数回インスタンスが待機しています。Awaiting the instance multiple times.
  • 呼び出すAsTask複数回です。Calling AsTask multiple times.
  • 使用して.Resultまたは.GetAwaiter().GetResult()ときに、操作はまだ完了していない、またはそれらを複数回使用します。Using .Result or .GetAwaiter().GetResult() when the operation hasn't yet completed, or using them multiple times.
  • これらの手法の 1 つ以上を使用して、インスタンスを使用します。Using more than one of these techniques to consume the instance.

上記のいずれかを行うと、結果は未定義です。If you do any of the above, the results are undefined.

メソッドはその操作の結果ができる同期的にすることを想定している場合こと可能性がある場合は、この値型のインスタンスが呼び出されたら頻繁に新しい割り当てのコストを返す可能性がありますTask<TResult>の各呼び出しは桁違いになります。A method may return an instance of this value type when it's likely that the result of its operation will be available synchronously, and when it's expected to be invoked so frequently that the cost of allocating a new Task<TResult> for each call will be prohibitive.

使用してにトレードオフがある、ValueTask<TResult>の代わりに、Task<TResult>します。There are tradeoffs to using a ValueTask<TResult> instead of a Task<TResult>. 中でも、ValueTask<TResult>成功の結果が使用可能な同期の場合、割り当てを防ぐことができますも含まれている 2 つのフィールドは、Task<TResult>型が 1 つのフィールドを参照として。For example, while a ValueTask<TResult> can help avoid an allocation in the case where the successful result is available synchronously, it also contains two fields, whereas a Task<TResult> as a reference type is a single field. つまり、メソッドの呼び出しでは、1 つではなくデータの価値が 2 つのフィールドが返しますは多くのデータをコピーします。This means that a method call returns two fields worth of data instead of one, which is more data to copy. またを返すメソッドの場合、 ValueTask<TResult> async メソッドと 1 つの参照ではなく 2 つのフィールドを含む構造体を格納する必要がありますので、サイズが大きくなりますが、非同期メソッドをステート マシン内で待機します。It also means, that if a method that returns a ValueTask<TResult> is awaited within an async method, the state machine for that async method will be larger, because it must store a struct containing two fields instead of a single reference.

Await を使用して、非同期操作の結果を使用する以外はのValueTask<TResult>複雑なプログラミング モデルを複数の割り当てを必要とする可能性があります。For uses other than consuming the result of an asynchronous operation using await, ValueTask<TResult> can lead to a more convoluted programming model that requires more allocations. たとえば、いずれかを返す可能性のあるメソッド、Task<TResult>で一般的な結果として、キャッシュされたタスクまたはValueTask<TResult>します。For example, consider a method that could return either a Task<TResult> with a cached task as a common result or a ValueTask<TResult>. 結果のコンシューマーとして使用するかどうか、Task<TResult>などのメソッドでWhenAllまたはWhenAnyValueTask<TResult>最初に変換する必要があります、Task<TResult>を使用してAsTaskは回避できた場合は、割り当てに市場をリードする、キャッシュされたTask<TResult>最初に使用されていた。If the consumer of the result wants to use it as a Task<TResult> in a method like WhenAll or WhenAny, the ValueTask<TResult> must first be converted to a Task<TResult> using AsTask, leading to an allocation that would have been avoided if a cached Task<TResult> had been used in the first place.

返す非同期メソッドの既定の選択肢は、そのため、TaskまたはTask<TResult>します。As such, the default choice for any asynchronous method should be to return a Task or Task<TResult>. パフォーマンスの分析を証明価値のある場合にのみにする必要があります、ValueTask<TResult>の代わりに使用する、Task<TResult>します。Only if performance analysis proves it worthwhile should a ValueTask<TResult> be used instead of a Task<TResult>. 非ジェネリック バージョンのValueTaskはほとんどのシナリオは推奨されません。The non generic version of ValueTask is not recommended for most scenarios. CompletedTaskメソッドを返す場合は、正常に完了した場合は、シングルトンを送り返すにプロパティを使用する必要があります、Taskが同期的に、正常に完了するとします。The CompletedTask property should be used to hand back a successfully completed singleton in the case where a method returning a Task completes synchronously and successfully.


使用、ValueTask<TResult>以降では、種類がサポートされてC#7.0 では、任意のバージョンの Visual Basic ではサポートされていません。The use of the ValueTask<TResult> type is supported starting with C# 7.0, and is not supported by any version of Visual Basic.


ValueTask<TResult>(Task<TResult>) ValueTask<TResult>(Task<TResult>) ValueTask<TResult>(Task<TResult>) ValueTask<TResult>(Task<TResult>)

操作を表す指定されたタスクを使用して、ValueTask<TResult> クラスの新しいインスタンスを初期化します。Initializes a new instance of the ValueTask<TResult> class using the supplied task that represents the operation.

ValueTask<TResult>(TResult) ValueTask<TResult>(TResult) ValueTask<TResult>(TResult) ValueTask<TResult>(TResult)

成功した操作の指定された結果を使用して、ValueTask<TResult> クラスの新しいインスタンスを初期化します。Initializes a new instance of the ValueTask<TResult> class using the supplied result of a successful operation.

ValueTask<TResult>(IValueTaskSource<TResult>, Int16) ValueTask<TResult>(IValueTaskSource<TResult>, Int16) ValueTask<TResult>(IValueTaskSource<TResult>, Int16) ValueTask<TResult>(IValueTaskSource<TResult>, Int16)


IsCanceled IsCanceled IsCanceled IsCanceled

このオブジェクトが取り消された操作を表すかどうかを示す値を取得します。Gets a value that indicates whether this object represents a canceled operation.

IsCompleted IsCompleted IsCompleted IsCompleted

このオブジェクトが完了した操作を表すかどうかを示す値を取得します。Gets a value that indicates whether this object represents a completed operation.

IsCompletedSuccessfully IsCompletedSuccessfully IsCompletedSuccessfully IsCompletedSuccessfully

このオブジェクトが正常に完了した操作を表すかどうかを示す値を取得します。Gets a value that indicates whether this object represents a successfully completed operation.

IsFaulted IsFaulted IsFaulted IsFaulted

このオブジェクトが失敗した操作を表すかどうかを示す値を取得します。Gets a value that indicates whether this object represents a failed operation.

Result Result Result Result

結果を取得します。Gets the result.


AsTask() AsTask() AsTask() AsTask()

この ValueTask<TResult> を表す Task<TResult> オブジェクトを取得します。Retrieves a Task<TResult> object that represents this ValueTask<TResult>.

ConfigureAwait(Boolean) ConfigureAwait(Boolean) ConfigureAwait(Boolean) ConfigureAwait(Boolean)

この値の awaiter を構成します。Configures an awaiter for this value.

CreateAsyncMethodBuilder() CreateAsyncMethodBuilder() CreateAsyncMethodBuilder() CreateAsyncMethodBuilder()

非同期のメソッドで使用するためにメソッドのビルダーを作成します。Creates a method builder for use with an async method.

Equals(Object) Equals(Object) Equals(Object) Equals(Object)

指定したオブジェクトが、現在のオブジェクトと等しいかどうかを判断します。Determines whether the specified object is equal to the current object.

Equals(ValueTask<TResult>) Equals(ValueTask<TResult>) Equals(ValueTask<TResult>) Equals(ValueTask<TResult>)

指定した ValueTask<TResult> オブジェクトが、現在の ValueTask<TResult> オブジェクトと等しいかどうかを判断します。Determines whether the specified ValueTask<TResult> object is equal to the current ValueTask<TResult> object.

GetAwaiter() GetAwaiter() GetAwaiter() GetAwaiter()

この値の awaiter を作成します。Creates an awaiter for this value.

GetHashCode() GetHashCode() GetHashCode() GetHashCode()

このインスタンスのハッシュ コードを返します。Returns the hash code for this instance.

Preserve() Preserve() Preserve() Preserve()
ToString() ToString() ToString() ToString()

現在のオブジェクトを表す文字列を返します。Returns a string that represents the current object.


Equality(ValueTask<TResult>, ValueTask<TResult>) Equality(ValueTask<TResult>, ValueTask<TResult>) Equality(ValueTask<TResult>, ValueTask<TResult>) Equality(ValueTask<TResult>, ValueTask<TResult>)

2 つの値が等しいかどうかを比較します。Compares two values for equality.

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

2 つの ValueTask<TResult> 値が等しくないかどうかを判断します。Determines whether two ValueTask<TResult> values are unequal.