Eric Lippert a une excellente réponse; je voulais juste décrire async
parallélisme, un peu plus loin.
Le simple "série" est l'endroit où vous await
juste une chose à la fois:
static void Process()
{
Thread.Sleep(100); // Do CPU work.
}
static async Task Test()
{
await Task.Run(Process);
await Task.Run(Process);
}
Dans cet exemple, l' Test
méthode de la file d'attente Process
pour le pool de threads, et quand il se termine, il file Process
nouveau pour le pool de threads. L' Test
méthode complète après ~200ms. À tout moment, un seul thread est vraiment le déplacement du progrès de l'avant.
Une façon simple de paralléliser c'est d'utiliser Task.WhenAll
:
static void Process()
{
Thread.Sleep(100); // Do CPU work.
}
static async Task Test()
{
// Start two background operations.
Task task1 = Task.Run(Process);
Task task2 = Task.Run(Process);
// Wait for them both to complete.
await Task.WhenAll(task1, task2);
}
Dans cet exemple, l' Test
méthode de files d'attente Process
du pool de threads, deux fois, puis il attend la fois pour compléter. L' Test
méthode complète après ~100ms.
Task.WhenAll
(et Task.WhenAny
) ont été introduites avec async
/await
pour soutenir simple parallélisme. Cependant, la TPL est toujours là si vous avez besoin de quelque chose de plus avancé (vrai lié au PROCESSEUR de traitement en parallèle est un meilleur ajustement pour le TPL). TPL joue bien avec async
/await
.
J'ai de base en async
parallélisme dans mon en async
blog, ainsi que le "contexte" qu'Eric a fait allusion.