Partager via


Await, opérateur (Visual Basic)

Vous appliquez l'opérateur d' Await à un opérande d'une méthode asynchrone ou une expression lambda pour interrompre l'exécution de la méthode jusqu'à ce que la tâche se termine attendue.La tâche représente le travail actif.

La méthode dans laquelle Await est utilisé doit avoir un modificateur d' Async .Une telle méthode, définie en utilisant le modificateur d' Async, et de contenir généralement un ou plusieurs expressions d' Await, connu sous le nom d'une méthode async.

[!REMARQUE]

Les mots clés d' Async et d' Await ont été introduits dans Visual Studio 2012.Pour plus d'informations sur les nouvelles fonctionnalités dans cette version, consultez Nouveautés de Visual Studio 2012.

Pour une introduction à l'async programmation, consultez l' Programmation asynchrone avec Async et Await (C# et Visual Basic).

En général, la tâche auquel vous s'appliquent l'opérateur d' Await est la valeur de retour d'un appel à une méthode qui implémente Modèle asynchrone basé Tâche-, c. autrement dit., Task ou Task<TResult>.

Dans le code suivant, la méthode GetByteArrayAsync d' HttpClient retourne getContentsTask, Task(Of Byte()).La tâche est une promesse de produire un tableau d'octets réel lorsque l'opération est terminée.L'opérateur d' Await est appliqué à getContentsTask pour interrompre l'exécution dans SumPageSizesAsync jusqu'à ce qu' getContentsTask terminé.Dans le même temps, le contrôle est retourné à l'appelant d' SumPageSizesAsync.Lorsque getContentsTask est terminé, l'expression d' Await correspond à 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 un exemple complet, consultez Procédure pas à pas : accès au Web avec Async et Await (C# et Visual Basic).Vous pouvez télécharger l'exemple de provenant Exemples de code de développement sur le site Web Microsoft.L'exemple se trouve dans le projet d'AsyncWalkthrough_HttpClient.

Si Await est appliqué au résultat d'un appel de méthode qui retourne Task(Of TResult), le type de l'expression d' Await est TResult.Si Await est appliqué au résultat d'un appel de méthode qui retourne Task, l'expression d' 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 expression ou une instruction d' Await ne bloque pas le thread sur lequel il s'exécute.À la place, il effectue enregistrer le compilateur le reste de la méthode async, après l'expression d' Await, comme une suite de la tâche attendue.Le contrôle retourne ensuite à l'appelant de la méthode async.Lorsque la tâche se termine, elle appelle sa continuation, et l'exécution de la méthode async continue où il a été arrêté.

Une expression d' Await peut se produire dans le corps d'une méthode immédiatement englobante ou d'une expression lambda qui est marquée par un modificateur d' Async .Le terme attendent sert de mot clé uniquement dans ce contexte.Ailleurs, il est interprète comme identificateur.Dans la méthode ou l'expression lambda async, une expression d' Await ne peut pas apparaître dans une expression de requête, dans le bloc d' catch ou d' finally d'une instruction d' Try… Catch… finally, dans l'expression de variable de contrôle de boucle d'une boucle d' For ou d' For Each, ou dans le corps d'une instruction d' SyncLock .

Exceptions

La plupart des méthodes async retournent Task ou Task<TResult>.Les propriétés de la tâche retournée comportent des informations sur son état et historique, par exemple si la tâche est terminée, si la méthode async a provoqué une exception ou a été annulée, et ce qui est le résultat final.L'opérateur d' Await accède à ces propriétés.

Si vous attendez une méthode tâche- se retournante async qui provoque une exception, le rethrows d'opérateur d' Await l'exception.

Si vous attendez une méthode tâche- se retournante async qui est annulée, les rethrows d'opérateur d' AwaitOperationCanceledException.

Une tâche unique qui est dans un état censuré 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, les rethrows un seul d'opération d'attente des exceptions.Toutefois, vous ne pouvez pas prédire lesquelles les exceptions sont à nouveau levée.

Pour obtenir des exemples de gestion des erreurs dans les méthodes async, consultez Try...Catch...Finally, instruction (Visual Basic).

Exemple

L'exemple suivant Windows Forms illustre l'utilisation d' Await dans une méthode async, WaitAsynchronouslyAsync.Comparez le comportement de cette méthode avec le comportement d' WaitSynchronously.Sans opérateur d' Await, WaitSynchronously fonctionne de façon synchrone en dépit de l'utilisation du modificateur d' Async dans sa définition et un appel à 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

Voir aussi

Tâches

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

Référence

Async (Visual Basic)

Concepts

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