ValueTask<TResult> Struct

Definitie

Biedt een waardetype waarmee een Task<TResult> en een TResult, waarvan slechts één wordt gebruikt, verpakt.

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

Type parameters

TResult

Het resultaat.

Overname
ValueTask<TResult>
Implementeringen
IEquatable<ValueTask<TResult>>

Opmerkingen

Een ValueTask<TResult> exemplaar kan worden gewacht of geconverteerd naar een Task<TResult> using AsTask. Een ValueTask<TResult> exemplaar kan slechts eenmaal worden gewacht en consumenten kunnen pas lezen Result als het exemplaar is voltooid. Als deze beperkingen onaanvaardbaar zijn, converteert u de ValueTask<TResult> naar een Task<TResult> door te bellen AsTask.

De volgende bewerkingen mogen nooit worden uitgevoerd op een ValueTask<TResult> exemplaar:

  • Wacht meerdere keren op het exemplaar.
  • Meerdere keren bellen AsTask .
  • Het gebruik .Result of .GetAwaiter().GetResult() wanneer de bewerking nog niet is voltooid, of meerdere keren gebruiken.
  • Gebruik meer dan een van deze technieken om het exemplaar te gebruiken.

Als u een van de bovenstaande handelingen uitvoert, zijn de resultaten niet gedefinieerd.

Een methode kan een exemplaar van dit waardetype retourneren wanneer het resultaat van de bewerking waarschijnlijk synchroon beschikbaar is en wanneer het naar verwachting zo vaak wordt aangeroepen dat de kosten voor het toewijzen van een nieuwe Task<TResult> aanroep verboden zijn.

Er zijn compromissen voor het gebruik van een ValueTask<TResult> in plaats van een Task<TResult>. Hoewel een ValueTask<TResult> toewijzing bijvoorbeeld kan helpen voorkomen in het geval dat het geslaagde resultaat synchroon beschikbaar is, bevat het ook meerdere velden, terwijl een Task<TResult> verwijzingstype één veld is. Dit betekent dat het retourneren van een ValueTask<TResult> methode resulteert in het kopiëren van meer gegevens. Het betekent ook dat als een methode die een ValueTask<TResult> retourneert, in een asynchrone methode wordt gewacht, de statusmachine voor die asynchrone methode groter is, omdat er een struct met meerdere velden moet worden opgeslagen in plaats van één verwijzing.

Voor andere toepassingen dan het verbruik van het resultaat van een asynchrone bewerking met behulp van await, ValueTask<TResult> kan leiden tot een meer convoluted programmeermodel waarvoor meer toewijzingen zijn vereist. Denk bijvoorbeeld aan een methode die een met een Task<TResult> taak in de cache kan retourneren als een gemeenschappelijk resultaat of een ValueTask<TResult>. Als de consument van het resultaat het wil gebruiken als een Task<TResult> methode zoals WhenAll of WhenAny, moet het ValueTask<TResult> eerst worden geconverteerd naar een Task<TResult> using AsTask, wat leidt tot een toewijzing die zou zijn vermeden als een in de cache Task<TResult> opgeslagen in de eerste plaats is gebruikt.

Als zodanig moet de standaardoptie voor elke asynchrone methode een Task of Task<TResult>. Alleen als prestatieanalyse bewijst dat het de moeite waard is om een ValueTask<TResult> te gebruiken in plaats van een Task<TResult>. De niet-algemene versie van ValueTask wordt niet aanbevolen voor de meeste scenario's. De CompletedTask eigenschap moet worden gebruikt om een voltooide singleton terug te geven in het geval dat een methode die een Task synchroon en succesvol retourneert, wordt voltooid.

Note

Het gebruik van het type ValueTask<TResult> wordt ondersteund vanaf C# 7.0 en wordt niet ondersteund door een versie van Visual Basic.

Note

Een exemplaar dat is gemaakt met de parameterloze constructor of door de default(ValueTask<TResult>) syntaxis (een structuur zonder initialisatie) vertegenwoordigt een synchrone, voltooide bewerking met het resultaat van default(TResult).

Constructors

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

Initialiseert een nieuw exemplaar van de ValueTask<TResult> klasse met een IValueTaskSource<TResult> object dat de bewerking vertegenwoordigt.

ValueTask<TResult>(Task<TResult>)

Initialiseert een nieuw exemplaar van de ValueTask<TResult> klasse met behulp van de opgegeven taak die de bewerking vertegenwoordigt.

ValueTask<TResult>(TResult)

Initialiseert een nieuw exemplaar van de ValueTask<TResult> klasse met behulp van het opgegeven resultaat van een geslaagde bewerking.

Eigenschappen

Name Description
IsCanceled

Hiermee wordt een waarde opgehaald die aangeeft of dit object een geannuleerde bewerking vertegenwoordigt.

IsCompleted

Hiermee wordt een waarde opgehaald die aangeeft of dit object een voltooide bewerking vertegenwoordigt.

IsCompletedSuccessfully

Hiermee wordt een waarde opgehaald die aangeeft of dit object een voltooide bewerking vertegenwoordigt.

IsFaulted

Hiermee wordt een waarde opgehaald die aangeeft of dit object een mislukte bewerking vertegenwoordigt.

Result

Hiermee haalt u het resultaat op.

Methoden

Name Description
AsTask()

Hiermee haalt u een Task<TResult> object op dat dit ValueTask<TResult>voorstelt.

ConfigureAwait(Boolean)

Hiermee configureert u een wachter voor deze waarde.

Equals(Object)

Bepaalt of het opgegeven object gelijk is aan het huidige object.

Equals(ValueTask<TResult>)

Bepaalt of het opgegeven ValueTask<TResult> object gelijk is aan het huidige ValueTask<TResult> object.

GetAwaiter()

Hiermee maakt u een wachter voor deze waarde.

GetHashCode()

Retourneert de hash-code voor dit exemplaar.

Preserve()

Hiermee haalt u een ValueTask<TResult> die op elk gewenst moment in de toekomst kan worden gebruikt.

ToString()

Retourneert een tekenreeks die het huidige object vertegenwoordigt.

Operators

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

Vergelijkt twee waarden voor gelijkheid.

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

Bepaalt of twee ValueTask<TResult> waarden ongelijk zijn.

Van toepassing op