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. L’exemple suivant définit une méthode async nommée ExampleMethodAsync
:
public async Task<int> ExampleMethodAsync()
{
//...
}
Si vous débutez en programmation asynchrone ou que vous ne comprenez pas comment une méthode async utilise l’opérateur await
pour un travail potentiellement long sans bloquer le thread de l’appelant, lisez l’introduction dans Programmation asynchrone avec async et await. Le code suivant se trouve dans une méthode async et appelle la méthode HttpClient.GetStringAsync :
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";
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: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
- 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 pasawait
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 typeSystem.Threading.Tasks.ValueTask<TResult>
est une implémentation de ce genre. Il est disponible en ajoutant le package NuGetSystem.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.