Maison > développement back-end > C++ > « Attendre » sur une tâche terminée est-il identique à l'utilisation de « Task.Result » ?

« Attendre » sur une tâche terminée est-il identique à l'utilisation de « Task.Result » ?

DDD
Libérer: 2025-01-22 22:54:14
original
788 Les gens l'ont consulté

Is `await` on a Completed Task Identical to Using `Task.Result`?

await vs Task.Result pour les tâches terminées : une analyse comparative

Le « Concurrency in C# Cookbook » de Stephen Cleary démontre une méthode de détection d'achèvement de tâche non bloquante :

<code class="language-csharp">var completedTask = await Task.WhenAny(downloadTask, timeoutTask);
if (completedTask == timeoutTask)
  return null;
return await downloadTask;</code>
Copier après la connexion

Cela soulève la question : le deuxième await est-il nécessaire si downloadTask est déjà terminé ? Pourquoi ne pas simplement utiliser downloadTask.Result ?

Les principales différences résident dans la gestion des exceptions et l'évitement des blocages.

Gestion des exceptions : une distinction cruciale

Task.Result enveloppe les exceptions dans un AggregateException, nécessitant un traitement spécifique. await, cependant, propage directement les exceptions, s'alignant mieux sur le flux naturel du code asynchrone et évitant les complexités de la AggregateException gestion.

Prévention des impasses : le filet de sécurité

Task.Result et Task.Wait peuvent introduire des blocages, notamment au sein des méthodes asynchrones. Étant donné qu’il est souvent difficile de déterminer définitivement l’achèvement d’une tâche dans des scénarios du monde réel, await offre une alternative plus sûre.

Meilleures pratiques pour la gestion des tâches

Pour garantir une programmation asynchrone robuste et sans blocage, suivez ces directives :

  1. Code asynchrone au niveau de l'application : Préférez await exclusivement.
  2. Code asynchrone au niveau de la bibliothèque : Task.Result ou Task.Wait peut être acceptable dans des fonctions utilitaires spécifiques, mais toujours avec une documentation claire décrivant les risques potentiels.
  3. Code de tâche parallèle : Task.Result et Task.Wait pourraient être plus appropriés dans des scénarios parallèles soigneusement contrôlés.

Dans la plupart des situations, await est l'approche recommandée pour gérer les tâches terminées, garantissant des opérations asynchrones fiables et sans blocage.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal