web-dev-qa-db-fra.com

"Tâche asynchrone puis attente de la tâche" vs "Tâche puis retour de la tâche"

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
    // ..
}
39
Khalil Khalaf

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.

39
René Vogt

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.

6
Falanwe