Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Vous appliquez l’opérateur Await
à un opérande dans une méthode asynchrone ou une expression lambda pour suspendre l’exécution de la méthode jusqu’à ce que la tâche attendue se termine. La tâche représente le travail en cours.
La méthode utilisée Await
doit avoir un modificateur asynchrone . Une telle méthode, définie à l’aide du Async
modificateur et contenant généralement une ou plusieurs Await
expressions, est appelée méthode asynchrone.
Remarque
Les mots clés Async
et Await
ont été introduits dans Visual Studio 2012. Pour une présentation de la programmation asynchrone, consultez Programmation asynchrone avec Async et Await.
En règle générale, la tâche à laquelle vous appliquez l’opérateur Await
est la valeur de retour d’un appel à une méthode qui implémente le modèle asynchroneTask-Based, autrement dit, a Task ou a Task<TResult>.
Dans le code suivant, la HttpClient méthode GetByteArrayAsync retourne getContentsTask
, a Task(Of Byte())
. La tâche est une promesse de produire le tableau d’octets réel lorsque l’opération est terminée. L’opérateur Await
est appliqué pour suspendre l’exécution jusqu’à getContentsTask
SumPageSizesAsync
ce qu’elle getContentsTask
soit terminée. En attendant, le contrôle est retourné à l’appelant de SumPageSizesAsync
. Une fois getContentsTask
terminée, l’expression Await
prend la valeur d’un tableau d’octets.
Private Async Function SumPageSizesAsync() As Task
' To use the HttpClient type in desktop apps, you must include a using directive and add a
' reference for the System.Net.Http namespace.
Dim client As HttpClient = New HttpClient()
' . . .
Dim getContentsTask As Task(Of Byte()) = client.GetByteArrayAsync(url)
Dim urlContents As Byte() = Await getContentsTask
' Equivalently, now that you see how it works, you can write the same thing in a single line.
'Dim urlContents As Byte() = Await client.GetByteArrayAsync(url)
' . . .
End Function
Important
Pour obtenir l’exemple complet, consultez Procédure pas à pas : accès au web à l’aide d’Async et Await. Vous pouvez télécharger l’exemple à partir de l’exemple de navigateur .NET. L’exemple de code se trouve dans le projet SerialAsyncExample .
Si Await
elle est appliquée au résultat d’un appel de méthode qui retourne un Task(Of TResult)
, le type de l’expression Await
est TResult. Si Await
elle est appliquée au résultat d’un appel de méthode qui retourne un Task
, l’expression Await
ne retourne pas de valeur. L'exemple suivant illustre la différence.
' Await used with a method that returns a Task(Of TResult).
Dim result As TResult = Await AsyncMethodThatReturnsTaskTResult()
' Await used with a method that returns a Task.
Await AsyncMethodThatReturnsTask()
Une Await
expression ou une instruction ne bloque pas le thread sur lequel il s’exécute. Au lieu de cela, le compilateur s’inscrit au reste de la méthode asynchrone, après l’expression Await
, en tant que continuation sur la tâche attendue. Le contrôle retourne ensuite à l’appelant de la méthode asynchrone. Une fois la tâche terminée, elle appelle sa continuation et l’exécution de la méthode asynchrone reprend là où elle s’est arrêtée.
Une Await
expression peut se produire uniquement dans le corps d’une méthode ou d’une expression lambda immédiatement englobante qui est marquée par un Async
modificateur. Le terme Await sert de mot clé uniquement dans ce contexte. Ailleurs, il est interprété comme un identificateur. Dans la méthode ou l’expression Async
lambda, une Await
expression ne peut pas se produire dans une expression de requête, dans le ou Finally
le Catch
bloc d’un try... Catch... Enfin, dans l’expression de variable de contrôle de boucle d’une boucle ou For Each
d’une For
boucle, ou dans le corps d’une instruction SyncLock.
Exceptions
La plupart des méthodes asynchrones retournent un Task ou Task<TResult>. Les propriétés de la tâche retournée contiennent des informations sur son état et son historique, par exemple si la tâche est terminée, si la méthode asynchrone a provoqué une exception ou a été annulée et quel est le résultat final. L’opérateur Await
accède à ces propriétés.
Si vous attendez une méthode asynchrone qui retourne une tâche qui provoque une exception, l’opérateur Await
réexéque l’exception.
Si vous attendez une méthode asynchrone qui retourne une tâche qui est annulée, l’opérateur Await
réexéque un OperationCanceledException.
Une tâche unique qui se trouve dans un état d’erreur peut refléter plusieurs exceptions. Par exemple, la tâche peut être le résultat d’un appel à Task.WhenAll. Lorsque vous attendez une telle tâche, l’opération Await se développe à nouveau l’une des exceptions. Toutefois, vous ne pouvez pas prédire quelles exceptions sont rethrown.
Pour obtenir des exemples de gestion des erreurs dans les méthodes asynchrones, consultez Try... Catch... Enfin, instruction.
Exemple :
L’exemple Windows Forms suivant illustre l’utilisation dans Await
une méthode asynchrone. WaitAsynchronouslyAsync
Contrastez le comportement de cette méthode par le comportement de WaitSynchronously
.
Await
Sans opérateur, WaitSynchronously
s’exécute de manière synchrone malgré l’utilisation du Async
modificateur dans sa définition et un appel dans Thread.Sleep son corps.
Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
' Call the method that runs asynchronously.
Dim result As String = Await WaitAsynchronouslyAsync()
' Call the method that runs synchronously.
'Dim result As String = Await WaitSynchronously()
' Display the result.
TextBox1.Text &= result
End Sub
' The following method runs asynchronously. The UI thread is not
' blocked during the delay. You can move or resize the Form1 window
' while Task.Delay is running.
Public Async Function WaitAsynchronouslyAsync() As Task(Of String)
Await Task.Delay(10000)
Return "Finished"
End Function
' The following method runs synchronously, despite the use of Async.
' You cannot move or resize the Form1 window while Thread.Sleep
' is running because the UI thread is blocked.
Public Async Function WaitSynchronously() As Task(Of String)
' Import System.Threading for the Sleep method.
Thread.Sleep(10000)
Return "Finished"
End Function