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.
Dans une méthode asynchrone, les tâches sont démarrées lors de leur création. L’opérateur Await est appliqué à la tâche au point dans la méthode où le traitement ne peut pas continuer tant que la tâche n’est pas terminée. Souvent, une tâche est attendue dès sa création, comme l’illustre l’exemple suivant.
Dim result = Await someWebAccessMethodAsync(url)
Toutefois, vous pouvez séparer la création de la tâche en attendant la tâche si votre programme a d’autres tâches à accomplir qui ne dépendent pas de l’achèvement de la tâche.
' The following line creates and starts the task.
Dim myTask = someWebAccessMethodAsync(url)
' While the task is running, you can do other work that does not depend
' on the results of the task.
' . . . . .
' The application of Await suspends the rest of this method until the task is
' complete.
Dim result = Await myTask
Entre le démarrage d’une tâche et son attente, vous pouvez démarrer d’autres tâches. Les tâches supplémentaires s’exécutent implicitement en parallèle, mais aucun thread supplémentaire n’est créé.
Le programme suivant démarre trois téléchargements web asynchrones, puis les attend dans l’ordre dans lequel ils sont appelés. Notez que lorsque vous exécutez le programme, les tâches ne se terminent pas toujours dans l’ordre dans lequel elles sont créées et attendues. Ils commencent à s’exécuter lorsqu’ils sont créés, et une ou plusieurs des tâches peuvent se terminer avant que la méthode atteigne les expressions await.
Remarque
Pour terminer ce projet, visual Studio 2012 ou version ultérieure doit être installé et le .NET Framework 4.5 ou version ultérieure doit être installé sur votre ordinateur.
Pour obtenir un autre exemple qui démarre plusieurs tâches en même temps, consultez Comment : étendre la procédure pas à pas asynchrone à l’aide de Task.WhenAll (Visual Basic).
Vous pouvez télécharger le code de cet exemple à partir d’exemples de code de développeur.
Pour configurer le projet
Pour configurer une application WPF, procédez comme suit. Vous trouverez des instructions détaillées pour ces étapes dans la procédure pas à pas : accès au web à l’aide d’Async et Await (Visual Basic).
Créez une application WPF qui contient une zone de texte et un bouton. Nommez le bouton
startButton
et nommez la zoneresultsTextBox
de texte.Ajoutez une référence pour System.Net.Http.
Dans le fichier MainWindow.xaml.vb, ajoutez une
Imports
instruction pourSystem.Net.Http
.
Pour ajouter le code
Dans la fenêtre de conception, MainWindow.xaml, double-cliquez sur le bouton pour créer le
startButton_Click
gestionnaire d’événements dans MainWindow.xaml.vb.Copiez le code suivant et collez-le dans le corps de
startButton_Click
MainWindow.xaml.vb.resultsTextBox.Clear() Await CreateMultipleTasksAsync() resultsTextBox.Text &= vbCrLf & "Control returned to button1_Click."
Le code appelle une méthode asynchrone,
CreateMultipleTasksAsync
qui pilote l’application.Ajoutez les méthodes de support suivantes au projet :
ProcessURLAsync
utilise une HttpClient méthode pour télécharger le contenu d’un site web en tant que tableau d’octets. La méthode de prise en charge afficheProcessURLAsync
et retourne la longueur du tableau.DisplayResults
affiche le nombre d’octets dans le tableau d’octets pour chaque URL. Cet affichage indique quand chaque tâche a terminé le téléchargement.
Copiez les méthodes suivantes et collez-les après le
startButton_Click
gestionnaire d’événements dans MainWindow.xaml.vb.Private Async Function ProcessURLAsync(url As String, client As HttpClient) As Task(Of Integer) Dim byteArray = Await client.GetByteArrayAsync(url) DisplayResults(url, byteArray) Return byteArray.Length End Function Private Sub DisplayResults(url As String, content As Byte()) ' Display the length of each website. The string format ' is designed to be used with a monospaced font, such as ' Lucida Console or Global Monospace. Dim bytes = content.Length ' Strip off the "https://". Dim displayURL = url.Replace("https://", "") resultsTextBox.Text &= String.Format(vbCrLf & "{0,-58} {1,8}", displayURL, bytes) End Sub
Enfin, définissez la méthode
CreateMultipleTasksAsync
, qui effectue les étapes suivantes.La méthode déclare un
HttpClient
objet, dans lequel vous devez accéder à la méthodeProcessURLAsync
GetByteArrayAsync.La méthode crée et démarre trois tâches de type Task<TResult>, où
TResult
est un entier. À la fin de chaque tâche,DisplayResults
affiche l’URL de la tâche et la longueur du contenu téléchargé. Étant donné que les tâches s’exécutent de manière asynchrone, l’ordre dans lequel les résultats apparaissent peut différer de l’ordre dans lequel ils ont été déclarés.La méthode attend l’achèvement de chaque tâche. Chaque
Await
opérateur interrompt l’exécution jusqu’àCreateMultipleTasksAsync
ce que la tâche attendue soit terminée. L’opérateur récupère également la valeur de retour de l’appel àProcessURLAsync
partir de chaque tâche terminée.Une fois les tâches terminées et les valeurs entières récupérées, la méthode additionne les longueurs des sites web et affiche le résultat.
Copiez la méthode suivante et collez-la dans votre solution.
Private Async Function CreateMultipleTasksAsync() As Task ' Declare an HttpClient object, and increase the buffer size. The ' default buffer size is 65,536. Dim client As HttpClient = New HttpClient() With {.MaxResponseContentBufferSize = 1000000} ' Create and start the tasks. As each task finishes, DisplayResults ' displays its length. Dim download1 As Task(Of Integer) = ProcessURLAsync("https://msdn.microsoft.com", client) Dim download2 As Task(Of Integer) = ProcessURLAsync("https://msdn.microsoft.com/library/hh156528(VS.110).aspx", client) Dim download3 As Task(Of Integer) = ProcessURLAsync("https://msdn.microsoft.com/library/67w7t67f.aspx", client) ' Await each task. Dim length1 As Integer = Await download1 Dim length2 As Integer = Await download2 Dim length3 As Integer = Await download3 Dim total As Integer = length1 + length2 + length3 ' Display the total count for all of the websites. resultsTextBox.Text &= String.Format(vbCrLf & vbCrLf & "Total bytes returned: {0}" & vbCrLf, total) End Function
Appuyez sur la touche F5 pour exécuter le programme, puis choisissez le bouton Démarrer.
Exécutez le programme plusieurs fois pour vérifier que les trois tâches ne se terminent pas toujours dans le même ordre et que l’ordre dans lequel ils se terminent n’est pas nécessairement l’ordre dans lequel ils sont créés et attendus.
Exemple :
Le code suivant contient l’exemple complet.
' Add the following Imports statements, and add a reference for System.Net.Http.
Imports System.Net.Http
Class MainWindow
Async Sub startButton_Click(sender As Object, e As RoutedEventArgs) Handles startButton.Click
resultsTextBox.Clear()
Await CreateMultipleTasksAsync()
resultsTextBox.Text &= vbCrLf & "Control returned to button1_Click."
End Sub
Private Async Function CreateMultipleTasksAsync() As Task
' Declare an HttpClient object, and increase the buffer size. The
' default buffer size is 65,536.
Dim client As HttpClient =
New HttpClient() With {.MaxResponseContentBufferSize = 1000000}
' Create and start the tasks. As each task finishes, DisplayResults
' displays its length.
Dim download1 As Task(Of Integer) =
ProcessURLAsync("https://msdn.microsoft.com", client)
Dim download2 As Task(Of Integer) =
ProcessURLAsync("https://msdn.microsoft.com/library/hh156528(VS.110).aspx", client)
Dim download3 As Task(Of Integer) =
ProcessURLAsync("https://msdn.microsoft.com/library/67w7t67f.aspx", client)
' Await each task.
Dim length1 As Integer = Await download1
Dim length2 As Integer = Await download2
Dim length3 As Integer = Await download3
Dim total As Integer = length1 + length2 + length3
' Display the total count for all of the websites.
resultsTextBox.Text &= String.Format(vbCrLf & vbCrLf &
"Total bytes returned: {0}" & vbCrLf, total)
End Function
Private Async Function ProcessURLAsync(url As String, client As HttpClient) As Task(Of Integer)
Dim byteArray = Await client.GetByteArrayAsync(url)
DisplayResults(url, byteArray)
Return byteArray.Length
End Function
Private Sub DisplayResults(url As String, content As Byte())
' Display the length of each website. The string format
' is designed to be used with a monospaced font, such as
' Lucida Console or Global Monospace.
Dim bytes = content.Length
' Strip off the "https://".
Dim displayURL = url.Replace("https://", "")
resultsTextBox.Text &= String.Format(vbCrLf & "{0,-58} {1,8}", displayURL, bytes)
End Sub
End Class