Question rapide..
Afin d'obtenir une compréhension de base solide sur la programmation asynchrone et le await
je voudrais savoir quelle est la différence entre ces deux extraits de code en ce qui concerne le multithread et la séquence et l'heure d'exécution:
Ce:
public Task CloseApp()
{
return Task.Run(
()=>{
// save database
// turn off some lights
// shutdown application
});
}
Versus ceci:
public async Task CloseApp()
{
await Task.Run(
()=>{
// save database
// turn off some lights
// shutdown application
});
}
si je l'appelle dans cette routine:
private async void closeButtonTask()
{
// Some Task 1
// ..
await CloseApp();
// Some Task 2
// ..
}
C'est presque la même chose (en termes de threads, etc.). Mais pour le second (en utilisant await
), beaucoup plus de frais généraux seront créés par le compilateur.
Les méthodes déclarées comme async
et utilisant await
sont converties en machine d'état par le compilateur. Ainsi, lorsque vous appuyez sur await
, le flux de contrôle est renvoyé à la méthode appelante et l'exécution de votre méthode async
reprend après _ await
lorsque le Task
attendu est terminé.
Comme il n'y a plus de code après votre await
, il n'est pas nécessaire d'utiliser await
de toute façon. Renvoyez simplement le Task
suffit.
Il y a très peu de différences entre les deux approches. Fondamentalement, ils partagent la même sémantique. Cependant, la version avec async/wait encapsule l'exécution de la tâche interne dans une tâche externe générée par le compilateur. La version non asynchrone ne fonctionne pas. Ainsi, la version non asynchrone est (très marginalement) plus efficace.