Async et attendre: démêler la programmation asynchrone
La programmation moderne repose fortement sur les opérations asynchrones en utilisant async
et await
. Tout en améliorant la lisibilité du code, ces mots clés introduisent des complexités qui nécessitent souvent des explications. Une idée fausse commune est que async
et await
créent de nouveaux threads d'arrière-plan pour des processus longs.
La réalité est plus nuancée. async
et await
Gérer les tâches asynchrones, mais elles ne reprennent pas directement les fils. Au lieu de cela, ils utilisent une approche différente. Le compilateur génère une machine d'état dans les coulisses lorsqu'il rencontre une méthode async
.
illustrons avec un exemple:
private async void button1_Click(object sender, EventArgs e) { Task<int> access = DoSomethingAsync(); // Other independent tasks here int a = 1; // Immediately accessible // Wait for the result of DoSomethingAsync() int x = await access; } async Task<int> DoSomethingAsync() { // Does this run on a background thread? System.Threading.Thread.Sleep(5000); return 1; }
Ici, await
demande au compilateur de faire une pause button1_Click
jusqu'à DoSomethingAsync
finitions. L'exécution reprend une fois la tâche terminée, permettant un accès immédiat à a
.
Surtout, DoSomethingAsync
ne fonctionne pas sur un thread d'arrière-plan dédié. La machine d'état du compilateur le planifie de manière asynchrone sur un fil de pool de fil. Cela signifie que l'environnement d'exécution de DoSomethingAsync
n'est pas prédéterminé; il peut fonctionner sur n'importe quel fil de filetage disponible.
La maîtrise de l'interaction entre async
et await
est vitale pour créer un code asynchrone efficace et évolutif. Ce mécanisme permet des opérations de longue date sans bloquer le thread principal, conduisant à une expérience utilisateur plus réactive et fluide.
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!