Maison >développement back-end >C++ >Tâche et parallèle

Tâche et parallèle

Patricia Arquette
Patricia Arquetteoriginal
2025-01-26 12:03:09780parcourir

Task and Parallel

Cet article explore les principales distinctions entre Parallel.ForEach et la famille Task (en particulier Task.WhenAll, Task.Run, etc.) en C#. Les deux facilitent l’exécution de code simultanée ou parallèle, mais leurs applications, comportements et gestion des tâches diffèrent considérablement.

Parallèle.ForEach :

Parallel.ForEach, membre de l'espace de noms System.Threading.Tasks, permet une itération parallèle sur les collections. Il répartit automatiquement la charge de travail entre les threads disponibles au sein du pool de threads, ce qui s'avère très efficace pour les opérations liées au processeur.

Caractéristiques principales :

  • Exécution parallèle : Les itérations s'exécutent simultanément sur plusieurs threads.
  • Thread Pool Reliance : Il exploite le pool de threads ; vous ne gérez pas directement la création des threads ou leur durée de vie.
  • Opération synchrone (par défaut) : L'exécution se bloque jusqu'à ce que la collection entière soit traitée.
  • Optimisation des tâches liées au CPU : Idéal pour les opérations gourmandes en CPU où les threads fonctionnent indépendamment.

Exemple :

<code class="language-csharp">using System;
using System.Threading.Tasks;

class Program
{
    static void Main(string[] args)
    {
        var items = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

        Parallel.ForEach(items, item =>
        {
            // Simulate CPU-intensive task (e.g., complex calculation)
            Console.WriteLine($"Processing item: {item} on thread {Task.CurrentId}");
        });

        Console.WriteLine("All items processed.");
    }
}</code>

Tâches (Task.Run, Task.WhenAll) :

Task.Run et Task.WhenAll offrent un contrôle granulaire sur l'exécution asynchrone et parallèle. Bien que Task.Run puisse décharger le travail lié au processeur, il est fréquemment associé à du code asynchrone pour les tâches liées aux E/S.

Principales caractéristiques :

  • Exécution asynchrone : Les tâches gèrent principalement la programmation asynchrone, en particulier les opérations liées aux E/S (appels réseau, accès à la base de données).
  • Gestion des tâches : Les tâches sont créées, gérées et attendues manuellement (à l'aide de Task.WhenAll, Task.WhenAny).
  • Flexibilité améliorée : Les tâches peuvent être créées et gérées individuellement ou en groupes, offrant un contrôle précis.
  • Optimisation des tâches liées aux E/S : Bien qu'utilisable pour les tâches liées au processeur, Task.Run excelle dans les scénarios nécessitant un comportement asynchrone.

Exemple :

<code class="language-csharp">using System;
using System.Threading.Tasks;

class Program
{
    static void Main(string[] args)
    {
        var items = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

        Parallel.ForEach(items, item =>
        {
            // Simulate CPU-intensive task (e.g., complex calculation)
            Console.WriteLine($"Processing item: {item} on thread {Task.CurrentId}");
        });

        Console.WriteLine("All items processed.");
    }
}</code>

Différences clés résumées:

Fonction parallèle.ForEach tâche.run / tâche.Whenall
Feature Parallel.ForEach Task.Run / Task.WhenAll
Primary Use Case Parallel iteration for CPU-bound tasks. Asynchronous and parallel execution (CPU/I/O).
Thread Control Less control; uses the thread pool. Full control over task creation and execution.
Execution Type Synchronous (blocking). Asynchronous (non-blocking unless awaited).
Task Type CPU-bound tasks (parallel for loop). General-purpose tasks (CPU-bound or I/O-bound).
Parallelism Parallelism Parallel or asynchronous.
Error Handling Exceptions thrown per iteration. Task.WhenAll aggregates exceptions.
Performance Automatic performance tuning. Manual task distribution management.
cas d'utilisation principale
itération parallèle pour les tâches liées au CPU. Exécution asynchrone et parallèle (CPU / E / S).

Contrôle du thread

Moins de contrôle; utilise la piscine de threads. Contrôle complet sur la création et l'exécution des tâches. Type d'exécution synchrone (blocage). asynchrone (non bloquant à moins que vous attendus).
    Type de tâche
Tâches liées au CPU (parallèle pour Loop). Tâches à usage général (liées au processeur ou liées aux E / O).

Parallélisme

Parallélisme parallèle ou asynchrone. Parallel.ForEach Gestion des erreurs Exceptions lancées par itération. Aggrégats Exceptions.
    Performance
Tunage des performances automatique. Gestion de la distribution des tâches manuelle. table>
  • Choisir le bon outil:
  • Utiliser quand: Task.Run Task.WhenAll

    Vous avez une tâche liée au CPU divisible en unités de travail indépendantes.
    • La parallélisation automatique sur plusieurs threads est souhaitée.
    • L'exécution synchrone est acceptable.
  • Utiliser
    /

    quand:

    Les tâches liées aux E / O sont impliquées. Parallel.ForEach Task.Run Un contrôle granulaire sur la gestion des tâches, l'annulation ou la synchronisation est nécessaire. Task.WhenAll

    combinant le parallélisme et l'asynchronie est nécessaire. Conclusion: est excellent pour les tâches simples liées au processeur nécessitant un contrôle minimal. et offrent une plus grande flexibilité, ce qui les rend idéaux pour les tâches liées au processeur et aux E / S, permettant la combinaison de la concurrence et du parallélisme avec un contrôle à grains fins.

    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