Partager via


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

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 un à l’aide AsTaskTask<TResult> de . 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 sont inacceptables, convertissez le ValueTask<TResult> en un Task<TResult> en appelant AsTask.

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

  • En attendant l’instance plusieurs fois.
  • Appel plusieurs AsTask fois.
  • Utilisation .Result ou .GetAwaiter().GetResult() lorsque l’opération n’est pas encore terminée, ou utilisation de ces dernières plusieurs fois.
  • Utilisation de plusieurs de ces techniques pour consommer l’instance.

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

Une méthode peut retourner une instance de ce type de valeur lorsqu’il est probable que le résultat de son opération sera disponible de manière synchrone et qu’elle est censée être appelée si fréquemment que le coût d’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, si un ValueTask<TResult> peut aider à éviter une allocation dans le cas où le résultat réussi est disponible de manière synchrone, il contient également plusieurs champs, tandis qu’un Task<TResult> en tant que type de référence est un seul champ. Cela signifie que le renvoi d’un ValueTask<TResult> à partir d’une méthode entraîne la copie de données supplémentaires. Cela signifie également que si une méthode qui retourne un ValueTask<TResult> est attendue dans une méthode asynchrone, la machine d’état de cette méthode asynchrone sera plus grande, car elle doit stocker un struct contenant plusieurs champs au lieu d’une seule référence.

Pour des utilisations autres que la consommation du résultat d’une opération asynchrone à l’aide d’await, ValueTask<TResult> peut conduire à un modèle de programmation plus alambiqué qui nécessite plus d’allocations. Par exemple, considérez une méthode qui pourrait retourner un Task<TResult> avec une tâche mise en cache comme résultat commun ou un ValueTask<TResult>. Si le consommateur du résultat souhaite l’utiliser en tant que Task<TResult> dans une méthode telle que WhenAll ou WhenAny, ValueTask<TResult> le doit d’abord être converti en un Task<TResult> à l’aide AsTaskde , ce qui aboutit à une allocation qui aurait été évitée si un mis en cache Task<TResult> avait été utilisé en premier lieu.

Par conséquent, le choix par défaut pour toute méthode asynchrone doit être de retourner un Task ou .Task<TResult> Ce n’est que si l’analyse des performances s’avère utile qu’un ValueTask<TResult> doit être utilisé au lieu d’un Task<TResult>. La version non générique de n’est ValueTask pas recommandée dans la plupart des scénarios. La CompletedTask propriété doit être utilisée pour remettre un singleton correctement terminé dans le cas où une méthode renvoyant un Task se termine de manière synchrone et réussie.

Remarque

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.

Remarque

Une instance créée avec le constructeur sans paramètre ou par la default(ValueTask<TResult>) syntaxe (une structure à initialisation zéro) représente une opération synchrone et terminée avec succès avec le résultat de 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 à