Procédure : Effectuer plusieurs requêtes Web en parallèle en utilisant Async et Await (Visual Basic)How to: Make Multiple Web Requests in Parallel by Using Async and Await (Visual Basic)

Dans une méthode asynchrone, les tâches sont démarrées quand elles sont créées.In an async method, tasks are started when they’re created. Le Await opérateur est appliqué à la tâche au point dans la méthode où le traitement ne peut pas continuer jusqu'à ce que la tâche se termine.The Await operator is applied to the task at the point in the method where processing can’t continue until the task finishes. Souvent, une tâche est attendue dès sa création, comme le montre l’exemple suivant.Often a task is awaited as soon as it’s created, as the following example shows.

Dim result = Await someWebAccessMethodAsync(url)  

Toutefois, vous pouvez séparer la création de la tâche de son attente si votre programme doit accomplir d’autres tâches qui ne dépendent pas de l’achèvement de la tâche.However, you can separate creating the task from awaiting the task if your program has other work to accomplish that doesn’t depend on the completion of the task.

' 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 le moment où elle est attendue, vous pouvez démarrer d’autres tâches.Between starting a task and awaiting it, you can start other tasks. Les tâches supplémentaires s’exécutent implicitement en parallèle, mais aucun thread supplémentaire n’est créé.The additional tasks implicitly run in parallel, but no additional threads are created.

Le programme suivant démarre trois téléchargements web asynchrones, puis les attend dans l’ordre dans lequel ils sont appelés.The following program starts three asynchronous web downloads and then awaits them in the order in which they’re called. Notez que quand vous exécutez le programme, les tâches ne se terminent pas toujours dans l’ordre dans lequel elles sont créées et attendues.Notice, when you run the program, that the tasks don’t always finish in the order in which they’re created and awaited. Elles commencent à s’exécuter quand elles sont créées, et une ou plusieurs d’entre elles peuvent se terminer avant que la méthode n’atteigne les expressions await.They start to run when they’re created, and one or more of the tasks might finish before the method reaches the await expressions.

Notes

Pour mener à bien ce projet, Visual Studio 2012 ou version ultérieure et le .NET Framework 4.5 ou version ultérieure doivent être installés sur votre ordinateur.To complete this project, you must have Visual Studio 2012 or higher and the .NET Framework 4.5 or higher installed on your computer.

Pour obtenir un autre exemple qui démarre plusieurs tâches en même temps, consultez Guide pratique pour Étendre la procédure pas à pas Async à l’aide de Task.WhenAll (Visual Basic).For another example that starts multiple tasks at the same time, see How to: Extend the Async Walkthrough by Using Task.WhenAll (Visual Basic).

Vous pouvez télécharger le code de cet exemple à partir des exemples de code pour développeur.You can download the code for this example from Developer Code Samples.

Pour configurer le projetTo set up the project

  1. Pour configurer une application WPF, effectuez les étapes suivantes.To set up a WPF application, complete the following steps. Vous trouverez des instructions détaillées pour ces étapes dans Procédure pas à pas : Accès Web à l’aide d’Async et Await (Visual Basic).You can find detailed instructions for these steps in Walkthrough: Accessing the Web by Using Async and Await (Visual Basic).

    • Créez une application WPF qui contient une zone de texte et un bouton.Create a WPF application that contains a text box and a button. Nommez le bouton startButton et la zone de texte resultsTextBox.Name the button startButton, and name the text box resultsTextBox.

    • Ajoutez une référence pour System.Net.Http.Add a reference for System.Net.Http.

    • Dans le fichier MainWindow.xaml.vb, ajoutez un Imports instruction pour System.Net.Http.In the MainWindow.xaml.vb file, add an Imports statement for System.Net.Http.

Pour ajouter le codeTo add the code

  1. 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.In the design window, MainWindow.xaml, double-click the button to create the startButton_Click event handler in MainWindow.xaml.vb.

  2. Copiez le code suivant et collez-le dans le corps de startButton_Click dans MainWindow.xaml.vb.Copy the following code, and paste it into the body of startButton_Click in 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.The code calls an asynchronous method, CreateMultipleTasksAsync, which drives the application.

  3. Ajoutez les méthodes de prise en charge suivantes au projet :Add the following support methods to the project:

    • ProcessURLAsync utilise une méthode HttpClient pour télécharger le contenu d’un site web sous la forme d’un tableau d’octets.ProcessURLAsync uses an HttpClient method to download the contents of a website as a byte array. La méthode de prise en charge, ProcessURLAsync, affiche et retourne ensuite la longueur du tableau.The support method, ProcessURLAsync then displays and returns the length of the array.

    • DisplayResults affiche le nombre d’octets dans le tableau d’octets pour chaque URL.DisplayResults displays the number of bytes in the byte array for each URL. Cet affichage indique quand le téléchargement de chaque tâche est terminé.This display shows when each task has finished downloading.

    Copiez les méthodes suivantes, puis collez-les après le startButton_Click Gestionnaire d’événements dans MainWindow.xaml.vb.Copy the following methods, and paste them after the startButton_Click event handler in 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  
    
  4. Pour finir, définissez la méthode CreateMultipleTasksAsync, qui effectue les étapes suivantes.Finally, define method CreateMultipleTasksAsync, which performs the following steps.

    • La méthode déclare un objet HttpClient, dont vous avez besoin pour accéder à la méthode GetByteArrayAsync dans ProcessURLAsync.The method declares an HttpClient object,which you need to access method GetByteArrayAsync in ProcessURLAsync.

    • La méthode crée et démarre trois tâches de type Task<TResult>, où TResult est un entier.The method creates and starts three tasks of type Task<TResult>, where TResult is an integer. À mesure que chaque tâche se termine, DisplayResults affiche son URL et la longueur du contenu téléchargé.As each task finishes, DisplayResults displays the task's URL and the length of the downloaded contents. Les tâches s’exécutant de façon asynchrone, l’ordre d’affichage des résultats peut différer de celui dans lequel les tâches ont été déclarées.Because the tasks are running asynchronously, the order in which the results appear might differ from the order in which they were declared.

    • La méthode attend l’achèvement de chaque tâche.The method awaits the completion of each task. Chaque opérateur Await suspend l’exécution de CreateMultipleTasksAsync jusqu’à la fin de la tâche attendue.Each Await operator suspends execution of CreateMultipleTasksAsync until the awaited task is finished. L’opérateur récupère également la valeur de retour de l’appel à ProcessURLAsync à partir de chaque tâche terminée.The operator also retrieves the return value from the call to ProcessURLAsync from each completed task.

    • 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.When the tasks have been completed and the integer values have been retrieved, the method sums the lengths of the websites and displays the result.

    Copiez la méthode suivante et collez-la dans votre solution.Copy the following method, and paste it into your 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  
    
  5. Appuyez sur la touche F5 pour exécuter le programme, puis choisissez le bouton Démarrer.Choose the F5 key to run the program, and then choose the Start button.

    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 elles se terminent n’est pas nécessairement celui dans lequel elles sont créées et attendues.Run the program several times to verify that the three tasks don’t always finish in the same order and that the order in which they finish isn't necessarily the order in which they’re created and awaited.

ExempleExample

Le code suivant contient l’exemple complet.The following code contains the full example.

' 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  

Voir aussiSee also