async (référence C#)

Utilisez le modificateur async pour spécifier qu'une méthode, une expression lambda ou une méthode anonyme sont asynchrones. Si vous utilisez ce modificateur sur une méthode ou une expression, il s'agit d'une méthode async.

public async Task<int> ExampleMethodAsync()
{
    // . . . .
}

Si vous débutez en programmation asynchrone ou que vous ne comprenez pas comment une méthode async utilise le mot clé await un travail potentiellement long sans bloquer le thread de l'appelant, lisez la présentation dans Programmation asynchrone avec Async et Await (C# et Visual Basic).

string contents = await contentsTask;

La méthode s'exécute de façon synchrone jusqu'à ce qu'elle atteigne sa première expression await, où elle est interrompue jusqu'à ce que la tâche attendue soit terminée. Dans le même temps, le contrôle retourne à l'appelant de la méthode, comme le montre l'exemple indiqué dans la section suivante.

Si la méthode que le mot clé async modifie ne contient pas une expression ou une instruction await, la méthode s'exécute de façon synchrone. Un avertissement du compilateur vous signale toutes les méthodes async qui ne contiennent pas await, car cette situation peut indiquer une erreur. Consultez Avertissement du compilateur (niveau 1) CS4014.

Le mot clé async est contextuel, car il est un mot clé uniquement lorsqu'il modifie une méthode, une expression lambda ou une méthode anonyme. Dans tous les autres contextes, il est interprété comme un identificateur.

Exemple

L'exemple suivant montre la structure et le flux de contrôle entre un gestionnaire d'événements asynchrones, StartButton_Click, et une méthode async, ExampleMethodAsync. Le résultat de la méthode async est la longueur d'un site Web téléchargé. Le code convient pour une application Windows Presentation Foundation (WPF) ou une application Windows Store que vous créez dans Visual Studio 2013 ; consultez les commentaires du code pour configurer l'application.

// You can run this code in Visual Studio 2013 as a WPF app or a Windows Store app.
// You need a button (StartButton) and a textbox (ResultsTextBox).
// Remember to set the names and handler so that you have something like this:
// <Button Content="Button" HorizontalAlignment="Left" Margin="88,77,0,0" VerticalAlignment="Top" Width="75"
//         Click="StartButton_Click" Name="StartButton"/>
// <TextBox HorizontalAlignment="Left" Height="137" Margin="88,140,0,0" TextWrapping="Wrap" 
//          Text="TextBox" VerticalAlignment="Top" Width="310" Name="ResultsTextBox"/>
        
// To run the code as a WPF app:
//    paste this code into the MainWindow class in MainWindow.xaml.cs,
//    add a reference to System.Net.Http, and
//    add a using directive for System.Net.Http.

// To run the code as a Windows Store app:
//    paste this code into the MainPage class in MainPage.xaml.cs, and
//    add using directives for System.Net.Http and System.Threading.Tasks.

private async void StartButton_Click(object sender, RoutedEventArgs e)
{
    // ExampleMethodAsync returns a Task<int>, which means that the method
    // eventually produces an int result. However, ExampleMethodAsync returns
    // the Task<int> value as soon as it reaches an await.
    ResultsTextBox.Text += "\n";
    try
    {
        int length = await ExampleMethodAsync();
        // Note that you could put "await ExampleMethodAsync()" in the next line where
        // "length" is, but due to when '+=' fetches the value of ResultsTextBox, you
        // would not see the global side effect of ExampleMethodAsync setting the text.
        ResultsTextBox.Text += String.Format("Length: {0}\n", length);
    }
    catch (Exception)
    {
        // Process the exception if one occurs.
    }
}

public async Task<int> ExampleMethodAsync()
{
    var httpClient = new HttpClient();
    int exampleInt = (await httpClient.GetStringAsync("https://msdn.microsoft.com")).Length;
    ResultsTextBox.Text += "Preparing to finish ExampleMethodAsync.\n";
    // After the following return statement, any method that's awaiting
    // ExampleMethodAsync (in this case, StartButton_Click) can get the 
    // integer result.
    return exampleInt;
}
// Output:
// Preparing to finish ExampleMethodAsync.
// Length: 53292

Important

Pour plus d'informations sur les tâches et le code qui s'exécute en attendant une tâche, consultez Programmation asynchrone avec Async et Await (C# et Visual Basic). Pour obtenir un exemple WPF complet qui utilise des éléments semblables, consultez Procédure pas à pas : accès au Web avec Async et Await (C# et Visual Basic).Vous pouvez télécharger le code de procédure depuis Exemples de code du développeur.

Types de retours

Une méthode async peut avoir un type de retour Task, Task, ou void. La méthode ne peut pas déclarer de paramètres ref ou out, mais elle peut appeler des méthodes comportant ces paramètres.

Vous spécifiez Task<TResult> comme type de retour d'une méthode async si l'instruction return de la méthode spécifie un opérande de type TResult. Utilisez Task si aucune valeur significative n'est retournée lorsque la méthode est terminée. En d'autres termes, un appel à la méthode retourne Task, mais lorsque Task est terminé, toute expression await qui attend Task prend la valeur void.

Vous utilisez le type de retour void principalement pour définir les gestionnaires d'événements, qui ont besoin de ce type de retour. L'appelant d'une méthode async retournant void ne peut pas l'attendre et ne peut pas intercepter les exceptions levées par la méthode.

Pour plus d'informations et d'exemples, consultez Types de retour Async (C# et Visual Basic).

Voir aussi

Tâches

Procédure pas à pas : accès au Web avec Async et Await (C# et Visual Basic)

Référence

await (Référence C#)

AsyncStateMachineAttribute

Concepts

Programmation asynchrone avec Async et Await (C# et Visual Basic)