ValueTask<TResult> Structure

Définition

Fournit un type valeur qui inclut dans un wrapper un Task<TResult> et un TResult, un seul d’entre eux étant utilisé.

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

Paramètres de type

TResult

Résultat.

Héritage
ValueTask<TResult>
Implémente
IEquatable<ValueTask<TResult>>

Remarques

Une ValueTask<TResult> instance peut être attendue ou convertie en Task<TResult> using AsTask . Une ValueTask<TResult> instance ne peut être attendue qu’une seule fois, et les consommateurs peuvent ne pas lire Result tant que l’instance n’est pas terminée. Si ces limitations ne sont pas acceptables, convertissez le en ValueTask<TResult> Task<TResult> en appelant AsTask .

Les opérations suivantes ne doivent jamais être effectuées sur une ValueTask<TResult> instance :

  • Attente répétée de l’instance.
  • Appel à AsTask plusieurs fois.
  • À l’aide .Result de ou .GetAwaiter().GetResult() lorsque l’opération n’est pas encore terminée, ou à l’aide de plusieurs fois.
  • Utilisation de plusieurs de ces techniques pour consommer l’instance.

Si vous effectuez l’une des actions ci-dessus, les résultats ne sont pas définis.

Une méthode peut retourner une instance de ce type valeur lorsqu’il est probable que le résultat de son opération sera disponible de façon synchrone, et lorsqu’elle est censée être appelée, si souvent que le coût de l’allocation d’un nouveau Task<TResult> pour chaque appel sera prohibitif.

Il existe des compromis à l’utilisation d’un ValueTask<TResult> au lieu d’un Task<TResult> . Par exemple, alors qu’un ValueTask<TResult> peut aider à éviter une allocation dans le cas où le résultat réussi est disponible de façon synchrone, il contient également plusieurs champs, tandis qu’un Task<TResult> type de référence est un champ unique. Cela signifie que le retour ValueTask<TResult> d’un à partir d’une méthode entraîne la copie de plus de données. Cela signifie également que si une méthode qui retourne un ValueTask<TResult> est attendue dans une méthode Async, l’ordinateur d’État pour cette méthode Async sera plus grand, car il doit stocker un struct contenant plusieurs champs au lieu d’une référence unique.

Pour les utilisations autres que la consommation du résultat d’une opération asynchrone utilisant await, ValueTask<TResult> peut conduire à un modèle de programmation plus compliqué qui nécessite plus d’allocations. Par exemple, considérez une méthode qui peut retourner un Task<TResult> avec une tâche mise en cache en tant que résultat courant ou ValueTask<TResult> . Si le consommateur du résultat souhaite l’utiliser comme un Task<TResult> dans une méthode comme WhenAll ou WhenAny , le doit d' ValueTask<TResult> abord être converti en un Task<TResult> avec AsTask , ce qui a été évité si un mis en cache Task<TResult> avait été utilisé pour la première fois.

Par conséquent, le choix par défaut pour toute méthode asynchrone doit être de retourner un Task ou un Task<TResult> . La seule façon d’utiliser l’analyse des performances est qu’elle peut ValueTask<TResult> être utilisée à la place d’un Task<TResult> . La version non générique de ValueTask n’est pas recommandée pour la plupart des scénarios. La CompletedTask propriété doit être utilisée pour remettre à la main un singleton correctement effectué dans le cas où une méthode retournant un se Task termine de façon synchrone et réussie.

Notes

L’utilisation du ValueTask<TResult> type est prise en charge à partir de C# 7,0 et n’est prise en charge par aucune version de Visual Basic.

Notes

Une instance créée avec le constructeur sans paramètre ou par la default(ValueTask<TResult>) syntaxe (une structure initialisée à zéro) représente une opération exécutée de façon synchrone avec succès avec le résultat default(TResult) .

Constructeurs

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

Initialise une nouvelle instance de la classe ValueTask<TResult> avec un objet IValueTaskSource<TResult> qui représente l’opération.

ValueTask<TResult>(Task<TResult>)

Initialise une nouvelle instance de la classe ValueTask<TResult> en utilisant la tâche fournie qui représente l’opération.

ValueTask<TResult>(TResult)

Initialise une nouvelle instance de la classe ValueTask<TResult> en utilisant le résultat fourni d’une opération ayant réussi.

Propriétés

IsCanceled

Obtient une valeur qui indique si cet objet représente une opération annulée.

IsCompleted

Obtient une valeur qui indique si cet objet représente une opération accomplie.

IsCompletedSuccessfully

Obtient une valeur qui indique si cet objet représente une opération réussie.

IsFaulted

Obtient une valeur qui indique si cet objet représente une opération ayant échoué.

Result

Obtient le résultat.

Méthodes

AsTask()

Récupère un objet Task<TResult> qui représente ce ValueTask<TResult>.

ConfigureAwait(Boolean)

Configure un awaiter pour cette valeur.

CreateAsyncMethodBuilder()

Crée un générateur de méthode à utiliser avec une méthode async.

Equals(Object)

Détermine si l'objet spécifié est égal à l'objet actuel.

Equals(ValueTask<TResult>)

Détermine si l'objet ValueTask<TResult> spécifié est égal à l'objet ValueTask<TResult> en cours.

GetAwaiter()

Crée un awaiter pour cette valeur.

GetHashCode()

Retourne le code de hachage de cette instance.

Preserve()

Obtient un ValueTask<TResult> qui peut être utilisé à tout moment dans le futur.

ToString()

Retourne une chaîne qui représente l'objet actuel.

Opérateurs

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

Compare si deux valeurs sont égales.

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

Détermine si deux valeurs ValueTask<TResult> sont inégales.

S’applique à