Teilen über


ValueTask<TResult> Struktur

Definition

Liefert einen Werttyp, der ein Task<TResult> und ein TResult umschließt, von denen nur einer verwendet wird.

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

Typparameter

TResult

Das Ergebnis.

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

Hinweise

Eine ValueTask<TResult> -Instanz kann entweder erwartet oder mit AsTaskin eine Task<TResult> konvertiert werden. Eine ValueTask<TResult> Instanz kann nur einmal erwartet werden, und Consumer können erst gelesen Result werden, wenn die Instanz abgeschlossen ist. Wenn diese Einschränkungen inakzeptabel sind, konvertieren Sie in ValueTask<TResult> ein, Task<TResult> indem Sie aufrufen AsTask.

Die folgenden Vorgänge sollten niemals für eine ValueTask<TResult> -Instanz ausgeführt werden:

  • Mehrfaches Warten auf die Instanz.
  • Mehrfaches Aufrufen AsTask .
  • Verwenden Sie .Result oder .GetAwaiter().GetResult() , wenn der Vorgang noch nicht abgeschlossen wurde, oder verwenden Sie sie mehrmals.
  • Verwenden sie mehr als eine dieser Techniken, um die -Instanz zu nutzen.

Wenn Sie eines der oben genannten Schritte ausführen, sind die Ergebnisse nicht definiert.

Eine Methode kann eine Instanz dieses Werttyps zurückgeben, wenn das Ergebnis ihres Vorgangs wahrscheinlich synchron verfügbar ist und wenn erwartet wird, dass sie so häufig aufgerufen wird, dass die Kosten für die Zuweisung eines neuen Task<TResult> Für jeden Aufrufs unerschwinglich sind.

Es gibt Kompromisse bei der Verwendung von anstelle ValueTask<TResult> von Task<TResult>. Ein kann beispielsweise helfen, eine Zuordnung für den Fall zu vermeiden, ValueTask<TResult> dass das erfolgreiche Ergebnis synchron verfügbar ist, enthält aber auch mehrere Felder, während ein Task<TResult> als Verweistyp ein einzelnes Feld ist. Dies bedeutet, dass das Zurückgeben von aus ValueTask<TResult> einer -Methode dazu führt, dass mehr Daten kopiert werden. Dies bedeutet auch, dass, wenn eine Methode, die zurückgibt ValueTask<TResult> , innerhalb einer asynchronen Methode erwartet wird, der Zustandscomputer für diese asynchrone Methode größer ist, da eine Struktur gespeichert werden muss, die mehrere Felder anstelle eines einzelnen Verweises enthält.

Bei anderen Verwendungen als der Verwendung des Ergebnisses eines asynchronen Vorgangs mithilfe von await kann dies zu einem komplexeren Programmiermodell führen, ValueTask<TResult> das mehr Zuordnungen erfordert. Betrachten Sie beispielsweise eine -Methode, die entweder eine Task<TResult> mit einer zwischengespeicherten Aufgabe als häufiges Ergebnis oder eine ValueTask<TResult>zurückgeben könnte. Wenn der Consumer des Ergebnisses es als in Task<TResult> einer Methode wie WhenAll oder WhenAnyverwenden möchte, muss zuerst ValueTask<TResult> in eine Task<TResult> mit AsTaskkonvertiert werden, was zu einer Zuordnung führt, die vermieden worden wäre, wenn überhaupt eine zwischengespeicherte Task<TResult> verwendet worden wäre.

Daher sollte die Standardoption für jede asynchrone Methode sein, ein Task oder Task<TResult>zurückzugeben. Nur wenn sich die Leistungsanalyse als sinnvoll erweist, sollte anstelle von verwendet ValueTask<TResult>Task<TResult>werden. Die nicht generische Version von ValueTask wird für die meisten Szenarien nicht empfohlen. Die CompletedTask -Eigenschaft sollte verwendet werden, um ein erfolgreich abgeschlossenes Singleton zurückzugeben, wenn eine Methode, die eine Task zurückgibt, synchron und erfolgreich abgeschlossen wird.

Hinweis

Die Verwendung des Typs ValueTask<TResult> wird ab C# 7.0 unterstützt und von keiner Version von Visual Basic unterstützt.

Hinweis

Eine Instanz, die mit dem parameterlosen Konstruktor oder der default(ValueTask<TResult>) Syntax (einer null initialisierten Struktur) erstellt wurde, stellt einen synchronen, erfolgreich abgeschlossenen Vorgang mit einem Ergebnis von default(TResult)dar.

Konstruktoren

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

Initialisiert eine neue Instanz der ValueTask<TResult>-Klasse mit einem IValueTaskSource<TResult>-Objekt, das den Vorgang darstellt.

ValueTask<TResult>(Task<TResult>)

Initialisiert eine neue Instanz der ValueTask<TResult>-Klasse unter Verwendung des angegebenen Tasks, der den Vorgang darstellt.

ValueTask<TResult>(TResult)

Initialisiert eine neue Instanz der ValueTask<TResult>-Klasse unter Verwendung des von einem erfolgreichen Vorgang zurückgegebenen Ergebnisses.

Eigenschaften

IsCanceled

Ruft einen Wert ab, der angibt, ob dieses Objekt einen abgebrochenen Vorgang darstellt.

IsCompleted

Ruft einen Wert ab, der angibt, ob dieses Objekt einen abgeschlossenen Vorgang darstellt.

IsCompletedSuccessfully

Ruft einen Wert ab, der angibt, ob dieses Objekt einen erfolgreich abgeschlossenen Vorgang darstellt.

IsFaulted

Ruft einen Wert ab, der angibt, ob dieses Objekt einen fehlgeschlagenen Vorgang darstellt.

Result

Ruft das Ergebnis ab.

Methoden

AsTask()

Ruft ein Task<TResult>-Objekt ab, das dieses ValueTask<TResult> darstellt.

ConfigureAwait(Boolean)

Konfiguriert ein „awaiter“-Element für diesen Wert.

CreateAsyncMethodBuilder()

Erstellt einen Methodengenerator für die Verwendung mit einer asynchronen Methode.

Equals(Object)

Bestimmt, ob das angegebene Objekt gleich dem aktuellen Objekt ist.

Equals(ValueTask<TResult>)

Bestimmt, ob das angegebene ValueTask<TResult>-Objekt mit dem aktuellen ValueTask<TResult>-Objekt identisch ist.

GetAwaiter()

Erstellt ein „awaiter“-Element für diesen Wert.

GetHashCode()

Gibt den Hashcode für diese Instanz zurück.

Preserve()

Ruft einen ValueTask<TResult> ab, der an einem beliebigen Zeitpunkt in der Zukunft verwendet werden kann.

ToString()

Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt.

Operatoren

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

Überprüft zwei Werte auf Gleichheit.

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

Bestimmt, ob zwei ValueTask<TResult>-Werte ungleich sind.

Gilt für: