Maison >développement back-end >C++ >Comment puis-je utiliser efficacement Async/Await pour plusieurs tâches parallèles en C# ?

Comment puis-je utiliser efficacement Async/Await pour plusieurs tâches parallèles en C# ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-22 03:21:08175parcourir

How Can I Efficiently Use Async/Await for Multiple Parallel Tasks in C#?

Utilisez efficacement Async/Await pour gérer plusieurs tâches en C#

Scène

Supposons qu'un client API asynchrone soit utilisé, qui renvoie une tâche ou une tâche, similaire à l'exemple suivant :

<code class="language-csharp">static async Task DoSomething(int siteId, int postId, IBlogClient client)
{
    await client.DeletePost(siteId, postId); // 调用API客户端
    Console.WriteLine("已删除帖子 {0}.", siteId);
}</code>

Le but est de démarrer plusieurs tâches asynchrones simultanément et d'attendre qu'elles se terminent. Deux méthodes couramment utilisées sont Parallel.ForEach et Task.WaitAll.

Inconvénients des méthodes existantes

Bien que Parallel.ForEach et Task.WaitAll tentent tous deux d'exécuter des tâches en parallèle, ils ont des limites.

  • Parallel.ForEach with Wait() : Bien que les tâches soient exécutées simultanément, l'appel Wait() bloque chaque thread participant. Ainsi, si un appel réseau dans une tâche prend 2 secondes, chaque thread reste inactif pendant ce temps, ce qui réduit l'efficacité.
  • Task.WaitAll : Encore une fois, cette méthode bloque le thread en cours jusqu'à ce que la tâche soit terminée. Pendant cette période de blocage, le thread ne peut pas gérer d'autres tâches.

Méthode recommandée

Pour surmonter ces limitations, nous vous recommandons d'utiliser Task.WhenAll, qui peut exécuter des tâches de manière asynchrone et en parallèle. Le code suivant démontre son utilisation :

<code class="language-csharp">public async Task DoWork() {

    int[] ids = new[] { 1, 2, 3, 4, 5 };
    await Task.WhenAll(ids.Select(i => DoSomething(1, i, blogClient)));
}</code>

Dans ce cas, puisqu'il n'y a pas d'opérations de suivi une fois la tâche terminée, wait n'est pas nécessaire. Le code simplifié suivant suffira :

<code class="language-csharp">public Task DoWork() 
{
    int[] ids = new[] { 1, 2, 3, 4, 5 };
    return Task.WhenAll(ids.Select(i => DoSomething(1, i, blogClient)));
}</code>

Pour plus d'informations et de comparaisons de ces approches, consultez l'article de blog complet : "Comment et où utiliser l'API Web ASP.NET pour les E/S asynchrones simultanées".

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