Maison > développement back-end > C++ > Quelles sont les principales différences entre `attendre la tâche.run (); return; `et` retour tâche.run () `en programmation asynchrone?

Quelles sont les principales différences entre `attendre la tâche.run (); return; `et` retour tâche.run () `en programmation asynchrone?

DDD
Libérer: 2025-01-30 04:01:08
original
397 Les gens l'ont consulté

What are the key differences between `await Task.Run(); return;` and `return Task.Run()` in asynchronous programming?

Dans -pth Discussion des principales différences dans la programmation asynchrone

et await Task.Run(); return; return Task.Run() Dans le domaine de la programmation asynchrone, une utilisation intelligente des mots clés

et

peut améliorer considérablement la lisibilité et les performances du code. Cependant, une question subtile apparaît: y a-t-il une différence fondamentale entre async et await? Pour clarifier ce problème, nous discuterons des détails de l'opération de ces deux méthodes. await Task.Run(); return; return Task.Run() Les différences dans le mécanisme de communication anormal

Une différence clé est le mode de communication anormal. Les anomalies rencontrées dans la méthode asynchrones seront transmises au dos , et à travers le

,

, Task ou await task observant l'état de sommeil avant le task.Wait(). Même si l'anomalie provient de la partie de synchronisation de la méthode, la situation est le cas. task.Result task.GetAwaiter().GetResult() Jetons un coup d'œil aux scènes suivantes: Task

Si est appelé avec

ensemble, il sortira:
static async Task OneTestAsync(int n)
{
    await Task.Delay(n);
}

static Task AnotherTestAsync(int n)
{
    return Task.Delay(n);
}

static void DoTestAsync(Func<int, Task> whatTest, int n)
{
    Task task = null;
    try
    {
        task = whatTest(n);
        Console.Write("Press enter to continue");
        Console.ReadLine();
        task.Wait();
    }
    catch (Exception ex)
    {
        Console.Write("Error: " + ex.Message);
    }
}
Copier après la connexion

DoTestAsync Il convient de noter que OneTestAsync peut provoquer des anomalies pendant la vérification. Cependant, lorsque <,> est utilisé, le comportement de la communication anormale est différent, comme indiqué ci-dessous:

<code>Press enter to continue
Error: One or more errors occurred.
Error: 2nd</code>
Copier après la connexion

<步> L'exécution de l'asynchrone et non-étape Delay(-2) AnotherTestAsync

<> Les méthodes favorisent l'exécution asynchrone. Au contraire,
<code>Error: The value needs to be either -1 (signifying an infinite timeout), 0 or a positive integer.
Parameter name: millisecondsDelayError: 1st</code>
Copier après la connexion
Démarrez un calcul d'étape non indifférent et l'exécution de la méthode sera suspendue jusqu'à la fin de la tâche.

L'influence du contexte synchrone

L'opération asynchrone est effectuée dans le contexte synchrone, le contexte détermine comment fonctionner et quand communiquer avec l'élément d'interface utilisateur. async/await Le symbole de fonctionnement est intrinsèquement traité le contexte synchronisé pour s'assurer que le code suivant est appelé dans le contexte correct. S'il n'y a pas de , cette responsabilité incombera au programmeur, ce qui peut entraîner le problème des verrous morts ou de la synchronisation du thread. return Task.Run()

En bref, le choix de

et dépend du comportement de communication anormal requis, de l'application asynchrone et non pas et des considérations de contexte synchrones. Le premier est généralement plus adapté à un traitement anormal plus précis et à une gestion du contexte de synchronisation correct, tandis que le second peut simplifier la structure du code dans certains cas, mais doit être utilisé avec prudence pour éviter les pièges potentiels.

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!

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