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 :
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 :
Task.WhenAll
, Task.WhenAny
).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>
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. |
Parallélisme
Parallel.ForEach
Gestion des erreurs Utiliser quand: Task.Run
Task.WhenAll
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
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!