string contents = await httpClient.GetStringAsync(requestUrl);
Une méthode async s’exécute de façon synchrone jusqu’à ce qu’elle atteigne sa première expression await
, où elle est suspendue 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 d’instructions 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 le nombre de caractères d’une page web. Le code convient pour une application WPF (Windows Presentation Foundation) ou une application du Windows Store que vous créez dans Visual Studio ; consultez les commentaires du code pour configurer l’application.
Vous pouvez exécuter ce code dans Visual Studio en tant qu’application Windows Presentation Foundation (WPF) ou qu’application du Windows Store. Vous avez besoin d’un contrôle Button nommé StartButton
et d’un contrôle Textbox nommé ResultsTextBox
. N’oubliez pas de définir les noms et le gestionnaire afin d’obtenir un résultat semblable à ceci :
<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="<Enter a URL>" VerticalAlignment="Top" Width="310" Name="ResultsTextBox"/>
Pour exécuter le code en tant qu’application WPF :
Collez ce code dans la classe MainWindow
dans MainWindow.xaml.cs.
Ajoutez une référence à System.Net.Http.
Ajoutez une directive using
à System.Net.Http.
Pour exécuter le code comme une application du Windows Store :
Collez ce code dans la classe MainPage
dans MainPage.xaml.cs.
Ajouter des directives using pour System.Net.Http et 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";
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:N0}\n", length);
catch (Exception)
// Process the exception if one occurs.
public async Task<int> ExampleMethodAsync()
var httpClient = new HttpClient();
int exampleInt = (await httpClient.GetStringAsync("http://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;
// The example displays the following output:
// Preparing to finish ExampleMethodAsync.
// Length: 53292
Important
Pour plus d’informations sur les tâches et sur le code qui s’exécute en attendant une tâche, consultez Programmation asynchrone avec async et await. Pour obtenir un exemple de console complète qui utilise des éléments similaires, consultez Traiter les tâches asynchrones à mesure qu’elles se terminent (C#).
Types de retour
Une méthode async peut avoir les types de retour suivants :
Task<TResult>
void. Les méthodes async void
sont généralement déconseillées pour le code autre que les gestionnaires d’événements parce que les appelants ne peuvent pas await
ces méthodes et doivent implémenter un mécanisme différent pour signaler les conditions d’erreur ou les complétions réussies.
Tout type qui a une méthode accessible GetAwaiter
. Le type System.Threading.Tasks.ValueTask<TResult>
est une implémentation de ce genre. Il est disponible en ajoutant le package NuGet System.Threading.Tasks.Extensions
.
La méthode async ne peut déclarer aucun paramètre in, ref ou out, ni avoir une valeur de retour de référence, mais elle peut appeler des méthodes qui ont 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.
Vous retournez un autre type, en général un type valeur, qui a une méthode GetAwaiter
permettant de limiter les allocations de mémoire dans les sections de code critiques pour les performances.
Pour obtenir plus d’informations et des exemples, consultez Types de retour Async.
Voir aussi
AsyncStateMachineAttribute
await
Programmation asynchrone avec async et await
Traiter les tâches asynchrones terminées
Blog .NET : Fonctionnement réel d’async/await en C#