ValueTask<TResult> Struct-datatyp

Definition

Tillhandahåller en värdetyp som omsluter en Task<TResult> och en TResult, varav endast en används.

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

Typparametrar

TResult

Resultatet.

Arv
ValueTask<TResult>
Implementeringar
IEquatable<ValueTask<TResult>>

Kommentarer

En ValueTask<TResult> instans kan antingen inväntas eller konverteras till en Task<TResult> med .AsTask En ValueTask<TResult> instans kan bara vänta en gång och användarna kanske inte läser Result förrän instansen har slutförts. Om dessa begränsningar är oacceptabla konverterar du ValueTask<TResult> till en Task<TResult> genom att anropa AsTask.

Följande åtgärder bör aldrig utföras på en ValueTask<TResult> instans:

  • Väntar på instansen flera gånger.
  • Anropar AsTask flera gånger.
  • Använda .Result eller .GetAwaiter().GetResult() när åtgärden ännu inte har slutförts eller använda dem flera gånger.
  • Använd mer än en av dessa tekniker för att använda instansen.

Om du gör något av ovanstående är resultatet odefinierat.

En metod kan returnera en instans av den här värdetypen när det är troligt att resultatet av åtgärden blir tillgängligt synkront och när det förväntas anropas så ofta att kostnaden för att allokera en ny Task<TResult> för varje anrop blir oöverkomlig.

Det finns kompromisser med att använda en ValueTask<TResult> i stället för en Task<TResult>. Även om en ValueTask<TResult> till exempel kan bidra till att undvika en allokering i det fall då det lyckade resultatet är tillgängligt synkront, innehåller det också flera fält, medan en Task<TResult> som referenstyp är ett enda fält. Det innebär att om du returnerar en ValueTask<TResult> från en metod kopieras mer data. Det innebär också att om en metod som returnerar en ValueTask<TResult> väntar inom en asynkron metod blir tillståndsdatorn för den asynkrona metoden större, eftersom den måste lagra en struct som innehåller flera fält i stället för en enda referens.

För andra användningsområden än att använda resultatet av en asynkron åtgärd med await ValueTask<TResult> kan det leda till en mer invecklad programmeringsmodell som kräver fler allokeringar. Du kan till exempel överväga en metod som kan returnera antingen en Task<TResult> med en cachelagrad uppgift som ett vanligt resultat eller en ValueTask<TResult>. Om konsumenten av resultatet vill använda det som en Task<TResult> i en metod som WhenAll eller WhenAnymåste ValueTask<TResult> först konverteras till en Task<TResult> med , AsTaskvilket leder till en allokering som skulle ha undvikits om en cachelagrad Task<TResult> hade använts från början.

Därför bör standardvalet för en asynkron metod vara att returnera en Task eller Task<TResult>. Endast om prestandaanalysen visar att det är värt bör en ValueTask<TResult> användas i stället för en Task<TResult>. Den icke-generiska versionen av ValueTask rekommenderas inte för de flesta scenarier. Egenskapen CompletedTask ska användas för att lämna tillbaka en lyckad singleton i det fall där en metod som returnerar en Task slutförd slutförs synkront och korrekt.

Note

Användningen av typen ValueTask<TResult> stöds från och med C# 7.0 och stöds inte av någon version av Visual Basic.

Note

En instans som skapats med den parameterlösa konstruktorn eller med syntaxen default(ValueTask<TResult>) (en nollinitierad struktur) representerar en synkront slutförd åtgärd med resultatet .default(TResult)

Konstruktorer

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

Initierar en ny instans av ValueTask<TResult> klassen med ett IValueTaskSource<TResult> objekt som representerar åtgärden.

ValueTask<TResult>(Task<TResult>)

Initierar en ny instans av klassen med hjälp av ValueTask<TResult> den angivna uppgift som representerar åtgärden.

ValueTask<TResult>(TResult)

Initierar en ny instans av ValueTask<TResult> klassen med det angivna resultatet av en lyckad åtgärd.

Egenskaper

Name Description
IsCanceled

Hämtar ett värde som anger om det här objektet representerar en avbruten åtgärd.

IsCompleted

Hämtar ett värde som anger om det här objektet representerar en slutförd åtgärd.

IsCompletedSuccessfully

Hämtar ett värde som anger om det här objektet representerar en åtgärd som har slutförts.

IsFaulted

Hämtar ett värde som anger om det här objektet representerar en misslyckad åtgärd.

Result

Hämtar resultatet.

Metoder

Name Description
AsTask()

Hämtar ett Task<TResult> objekt som representerar detta ValueTask<TResult>.

ConfigureAwait(Boolean)

Konfigurerar en awaiter för det här värdet.

Equals(Object)

Avgör om det angivna objektet är lika med det aktuella objektet.

Equals(ValueTask<TResult>)

Avgör om det angivna ValueTask<TResult> objektet är lika med det aktuella ValueTask<TResult> objektet.

GetAwaiter()

Skapar en awaiter för det här värdet.

GetHashCode()

Returnerar hash-koden för den här instansen.

Preserve()

Hämtar en ValueTask<TResult> som kan användas när som helst i framtiden.

ToString()

Returnerar en sträng som representerar det aktuella objektet.

Operatorer

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

Jämför två värden för likhet.

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

Avgör om två ValueTask<TResult> värden är olika.

Gäller för