Maison >développement back-end >C++ >Attendre tâche.run () vs tâche de retour.run (): quelles sont les principales différences dans la programmation asynchrone C #?

Attendre tâche.run () vs tâche de retour.run (): quelles sont les principales différences dans la programmation asynchrone C #?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-30 03:51:14440parcourir

Await Task.Run() vs. Return Task.Run(): What are the Key Differences in C# Asynchronous Programming?

C # Programmation asynchrone

La différence clé entre await Task.Run() return Task.Run() Dans la programmation asynchrone, il est souvent nécessaire d'effectuer des opérations en dehors du thread d'interface utilisateur pour éviter l'application de l'application. Cela peut être réalisé grâce à la tâche en C #. Cependant, il existe des différences subtiles entre

et

lorsqu'ils traitent des anomalies et d'autres aspects. await Task.Run() return Task.Run() <.> 1. Disposition:

La principale différence est cette communication anormale. Dans situation:

Les anomalies de la tâche asynchrone ne diffuseront la méthode de rappel que lorsque vous attendez la tâche. await Task.Run()

Cela leur permet de faire face aux anomalies de manière contrôlée pour les empêcher de le lancer accidentellement sur le fil d'interface utilisateur.
  • au contraire, dans dans le cas:
Les anomalies lancées pendant l'exécution de la tâche seront immédiatement renvoyées à la méthode d'appel, et avant même d'observer la tâche.

return Task.Run() Cela peut entraîner des erreurs accidentelles et des blocages potentiels.

  • <.> 2. Dépendance du contexte synchrone:
  • Une autre différence est que la version
dépend du contexte de synchronisation des threads d'appel. Une fois la tâche terminée, elle sera exécutée dans le même contexte de synchronisation. Cela garantit que la mise à jour de l'interface utilisateur (comme l'activation du bouton désactivé) se produit sur le thread correct.

au contraire, la version ne dépend pas du contexte de la synchronisation. Poursuivant l'arrangement du programme de planification de tâches par défaut, qui peut être différent du contexte de synchronisation des threads d'appel.

<.> 3. Le code généré:

await Task.Run()

Le code généré par les deux méthodes est légèrement différent. Dans le cas de , une machine d'état asynchrones / attendre sera créée pour gérer l'exécution asynchrone. Cela conduit à un code plus compliqué que .

return Task.Run() Exemple de code:

L'exemple de code suivant illustre ces différences:

Exemple 1:

await Task.Run() return Task.Run()

Exemple 2:

Dans ces deux exemples, "DoSomework ()" est une méthode pour effectuer certains travaux en dehors du fil d'interface utilisateur.

Conclusion:

Le choix de et

dépend des besoins spécifiques de l'application. Lors du contrôle de la dissémination anormale et de la garantie du contexte de synchronisation correct est important, il est recommandé d'utiliser
<code class="language-csharp">async Task TestAsync()
{
    await Task.Run(() => DoSomeWork()); // 异常在等待时传播回
}</code>
. Lorsque ce n'est pas un problème pour répandre les anomalies ou synchroniser immédiatement les contextes,

convient.

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