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

Definition

Liefert einen Werttyp, der ein Task<TResult> und ein TResult umschließt, von denen nur einer verwendet wird.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))

Typparameter

TResult

Das Ergebnis.The result.

Vererbung
ValueTask<TResult>ValueTask<TResult>ValueTask<TResult>ValueTask<TResult>
Implementiert
IEquatable<ValueTask<TResult>>

Hinweise

Eine ValueTask<TResult> -Instanz kann entweder gewartet oder mithilfe AsTaskvon in Task<TResult> eine konvertiert werden.A ValueTask<TResult> instance may either be awaited or converted to a Task<TResult> using AsTask. Eine ValueTask<TResult> -Instanz kann nur einmal gewartet werden, und Consumer können erst GetAwaiter() dann aufzurufen, wenn die Instanz abgeschlossen wurde.A ValueTask<TResult> instance may only be awaited once, and consumers may not call GetAwaiter() until the instance has completed. Wenn diese Einschränkungen nicht zulässig sind, konvertieren ValueTask<TResult> Sie den Task<TResult> in einen AsTask, indem Sie aufrufen.If these limitations are unacceptable, convert the ValueTask<TResult> to a Task<TResult> by calling AsTask.

Die folgenden Vorgänge sollten nie auf einer ValueTask<TResult> -Instanz ausgeführt werden:The following operations should never be performed on a ValueTask<TResult> instance:

  • Mehrmals auf die Instanz warten.Awaiting the instance multiple times.
  • Mehrmals AsTask aufrufen.Calling AsTask multiple times.
  • Verwenden .Result Sie .GetAwaiter().GetResult() oder, wenn der Vorgang noch nicht abgeschlossen wurde, oder verwenden Sie Sie mehrmals.Using .Result or .GetAwaiter().GetResult() when the operation hasn't yet completed, or using them multiple times.
  • Verwenden Sie mehr als eine dieser Techniken, um die-Instanz zu verwenden.Using more than one of these techniques to consume the instance.

Wenn Sie eine der oben genannten Aktionen ausführen, sind die Ergebnisse nicht definiert.If you do any of the above, the results are undefined.

Eine Methode kann eine Instanz dieses Werttyps zurückgeben, wenn es wahrscheinlich ist, dass das Ergebnis des Vorgangs synchron verfügbar ist, und wenn erwartet wird, dass die Kosten für das Zuordnen eines neuen Task<TResult> für jeden Aufruf nicht mehr ausreichen.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.

Es gibt Kompromisse bei ValueTask<TResult> Task<TResult>der Verwendung eines anstelle von.There are tradeoffs to using a ValueTask<TResult> instead of a Task<TResult>. Wenn beispielsweise eine ValueTask<TResult> Zuordnung vermieden werden kann, wenn das erfolgreiche Ergebnis synchron verfügbar ist, enthält es auch mehrere Felder, Task<TResult> wohingegen als Verweistyp ein einzelnes Feld ist.For example, while a ValueTask<TResult> can help avoid an allocation in the case where the successful result is available synchronously, it also contains multiple fields, whereas a Task<TResult> as a reference type is a single field. Dies bedeutet, dass das ValueTask<TResult> zurückgeben von aus einer Methode dazu führt, dass mehr Daten kopiert werden.This means that returning a ValueTask<TResult> from a method results in copying more data. Dies bedeutet auch Folgendes: Wenn eine Methode, die einen ValueTask<TResult> zurückgibt, in einer asynchronen Methode erwartet wird, ist der Zustands Automat für diese Async-Methode größer, da Sie eine Struktur mit mehreren Feldern anstelle eines einzelnen Verweises speichern muss.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 multiple fields instead of a single reference.

Für andere Verwendungszwecke als das Ergebnis eines asynchronen Vorgangs mithilfe von "warten ValueTask<TResult> " kann zu einem eher zusammenhängenden Programmiermodell führen, das mehr Zuordnungen erfordert.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. Stellen Sie sich beispielsweise eine Methode vor, die entweder Task<TResult> einen mit einer zwischengespeicherten Aufgabe als häufiges Ergebnis oder ValueTask<TResult>einen zurückgeben kann.For example, consider a method that could return either a Task<TResult> with a cached task as a common result or a ValueTask<TResult>. Wenn der Consumer des Ergebnisses ihn als Task<TResult> in einer Methode wie WhenAll oder WhenAnyverwenden möchte, ValueTask<TResult> muss zuerst in eine Task<TResult> mit AsTaskkonvertiert werden. Dies führt zu einer Zuordnung, die vermieden werden würde, wenn ein die Task<TResult> Zwischenspeicherung wurde bereits verwendet.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.

Daher sollte die Standardauswahl für jede asynchrone Methode sein, wenn Task oder Task<TResult>zurückgeben soll.As such, the default choice for any asynchronous method should be to return a Task or Task<TResult>. Nur, wenn sich die Leistungsanalyse als ValueTask<TResult> lohnend erweist, sollte anstelle Task<TResult>eines verwendet werden.Only if performance analysis proves it worthwhile should a ValueTask<TResult> be used instead of a Task<TResult>. Die nicht generische Version von ValueTask wird in den meisten Szenarien nicht empfohlen.The non generic version of ValueTask is not recommended for most scenarios. Die CompletedTask -Eigenschaft sollte verwendet werden, um ein erfolgreich ausgefülltes Singleton zurückzugeben, wenn eine Methode Task , die zurückgibt, synchron und erfolgreich abgeschlossen wird.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.

Hinweis

Die Verwendung des ValueTask<TResult> -Typs wird ab C# 7,0 unterstützt und wird von keiner Version von Visual Basic unterstützt.The use of the ValueTask<TResult> type is supported starting with C# 7.0, and is not supported by any version of Visual Basic.

Konstruktoren

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

Initialisiert eine neue Instanz der ValueTask<TResult>-Klasse unter Verwendung des angegebenen Tasks, der den Vorgang darstellt.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)

Initialisiert eine neue Instanz der ValueTask<TResult>-Klasse unter Verwendung des von einem erfolgreichen Vorgang zurückgegebenen Ergebnisses.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)

Initialisiert eine neue Instanz der ValueTask<TResult>-Klasse mit einem IValueTaskSource<TResult>-Objekt, das den Vorgang darstellt.Initializes a new instance of the ValueTask<TResult> class with a IValueTaskSource<TResult> object that represents the operation.

Eigenschaften

IsCanceled IsCanceled IsCanceled IsCanceled

Ruft einen Wert ab, der angibt, ob dieses Objekt einen abgebrochenen Vorgang darstellt.Gets a value that indicates whether this object represents a canceled operation.

IsCompleted IsCompleted IsCompleted IsCompleted

Ruft einen Wert ab, der angibt, ob dieses Objekt einen abgeschlossenen Vorgang darstellt.Gets a value that indicates whether this object represents a completed operation.

IsCompletedSuccessfully IsCompletedSuccessfully IsCompletedSuccessfully IsCompletedSuccessfully

Ruft einen Wert ab, der angibt, ob dieses Objekt einen erfolgreich abgeschlossenen Vorgang darstellt.Gets a value that indicates whether this object represents a successfully completed operation.

IsFaulted IsFaulted IsFaulted IsFaulted

Ruft einen Wert ab, der angibt, ob dieses Objekt einen fehlgeschlagenen Vorgang darstellt.Gets a value that indicates whether this object represents a failed operation.

Result Result Result Result

Ruft das Ergebnis ab.Gets the result.

Methoden

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

Ruft ein Task<TResult>-Objekt ab, das dieses ValueTask<TResult> darstellt.Retrieves a Task<TResult> object that represents this ValueTask<TResult>.

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

Konfiguriert ein „awaiter“-Element für diesen Wert.Configures an awaiter for this value.

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

Erstellt einen Methodengenerator für die Verwendung mit einer asynchronen Methode.Creates a method builder for use with an async method.

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

Bestimmt, ob das angegebene Objekt mit dem aktuellen Objekt identisch ist.Determines whether the specified object is equal to the current object.

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

Bestimmt, ob das angegebene ValueTask<TResult>-Objekt mit dem aktuellen ValueTask<TResult>-Objekt identisch ist.Determines whether the specified ValueTask<TResult> object is equal to the current ValueTask<TResult> object.

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

Erstellt ein „awaiter“-Element für diesen Wert.Creates an awaiter for this value.

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

Gibt den Hashcode für diese Instanz zurück.Returns the hash code for this instance.

Preserve() Preserve() Preserve() Preserve()

Ruft einen ValueTask<TResult> ab, der an einem beliebigen Zeitpunkt in der Zukunft verwendet werden kann.Gets a ValueTask<TResult> that may be used at any point in the future.

ToString() ToString() ToString() ToString()

Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt.Returns a string that represents the current object.

Operatoren

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

Überprüft zwei Werte auf Gleichheit.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>)

Bestimmt, ob zwei ValueTask<TResult>-Werte ungleich sind.Determines whether two ValueTask<TResult> values are unequal.

Gilt für: