Procédure pas à pas : Accès au Web avec Async et await (Visual Basic)Walkthrough: Accessing the Web by Using Async and Await (Visual Basic)

Vous pouvez écrire des programmes asynchrones plus facilement et intuitivement en utilisant les fonctionnalités async/await.You can write asynchronous programs more easily and intuitively by using async/await features. Vous pouvez écrire du code asynchrone qui ressemble au code synchrone et laisser le compilateur gérer les difficiles fonctions de rappel et continuations qu’implique généralement le code asynchrone.You can write asynchronous code that looks like synchronous code and let the compiler handle the difficult callback functions and continuations that asynchronous code usually entails.

Pour plus d’informations sur la fonctionnalité Async, consultez programmation asynchrone avec Async et await (Visual Basic).For more information about the Async feature, see Asynchronous Programming with Async and Await (Visual Basic).

Cette procédure pas à pas commence avec une application Windows Presentation Foundation (WPF) synchrone qui additionne le nombre d’octets figurant dans une liste de sites web.This walkthrough starts with a synchronous Windows Presentation Foundation (WPF) application that sums the number of bytes in a list of websites. La procédure pas à pas convertit ensuite l’application en solution asynchrone en utilisant les nouvelles fonctionnalités.The walkthrough then converts the application to an asynchronous solution by using the new features.

Si vous ne souhaitez pas générer les applications vous-même, vous pouvez télécharger «exemple Async: Accès à la procédure pas àC# pas Web (et Visual Basic)» à partir des exemples de code du développeur.If you don't want to build the applications yourself, you can download "Async Sample: Accessing the Web Walkthrough (C# and Visual Basic)" from Developer Code Samples.

Dans cette procédure pas à pas, vous effectuez les tâches suivantes :In this walkthrough, you complete the following tasks:

Consultez la section exemple pour obtenir un exemple asynchrone complet.See the Example section for the complete asynchronous example.

PrérequisPrerequisites

Visual Studio 2012 ou version ultérieure doit être installé sur votre ordinateur.Visual Studio 2012 or later must be installed on your computer. Pour plus d’informations, consultez la page téléchargements Visual Studio.For more information, see the Visual Studio Downloads page.

Créer une application WPFCreate a WPF application

  1. Démarrez Visual Studio.Start Visual Studio.

  2. Dans la barre de menus, sélectionnez Fichier, Nouveau, Projet.On the menu bar, choose File, New, Project.

    La boîte de dialogue Nouveau projet s'affiche.The New Project dialog box opens.

  3. Dans le volet modèles installés , choisissez Visual Basic, puis choisissez application WPF dans la liste des types de projets.In the Installed Templates pane, choose Visual Basic, and then choose WPF Application from the list of project types.

  4. Dans la zone de texte Nom, entrez AsyncExampleWPF, puis choisissez le bouton OK.In the Name text box, enter AsyncExampleWPF, and then choose the OK button.

    Le nouveau projet s’affiche dans l’Explorateur de solutions.The new project appears in Solution Explorer.

Concevoir une simple fenêtre MainWindow WPFDesign a simple WPF MainWindow

  1. Dans l'éditeur de code Visual Studio, choisissez l'onglet MainWindow.xaml .In the Visual Studio Code Editor, choose the MainWindow.xaml tab.

  2. Si la fenêtre Boîte à outils n’est pas visible, ouvrez le menu Affichage, puis choisissez Boîte à outils.If the Toolbox window isn’t visible, open the View menu, and then choose Toolbox.

  3. Ajoutez un contrôle Button et un contrôle TextBox à la fenêtre MainWindow.Add a Button control and a TextBox control to the MainWindow window.

  4. Mettez en surbrillance le contrôle TextBox et, dans la fenêtre Propriétés, définissez les valeurs suivantes :Highlight the TextBox control and, in the Properties window, set the following values:

    • Affectez la valeur resultsTextBox à la propriété Name.Set the Name property to resultsTextBox.

    • Affectez la valeur 250 à la propriété Height.Set the Height property to 250.

    • Affectez la valeur 500 à la propriété Width.Set the Width property to 500.

    • Sous l’onglet Texte, spécifiez une police à espacement fixe, comme Lucida Console ou Global Monospace.On the Text tab, specify a monospaced font, such as Lucida Console or Global Monospace.

  5. Mettez en surbrillance le contrôle Button et, dans la fenêtre Propriétés, définissez les valeurs suivantes :Highlight the Button control and, in the Properties window, set the following values:

    • Affectez la valeur startButton à la propriété Name.Set the Name property to startButton.

    • Remplacez la valeur Button de la propriété Content par Démarrer.Change the value of the Content property from Button to Start.

  6. Placez la zone de texte et le bouton de manière à ce qu’ils apparaissent tous les deux dans la fenêtre MainWindow.Position the text box and the button so that both appear in the MainWindow window.

    Pour plus d’informations sur le concepteur XAML WPF, consultez Création d’une interface utilisateur à l’aide du concepteur XAML.For more information about the WPF XAML Designer, see Creating a UI by using XAML Designer.

Ajouter une référenceAdd a reference

  1. Dans l’Explorateur de solutions, mettez en surbrillance le nom de votre projet.In Solution Explorer, highlight your project's name.

  2. Dans la barre de menus, choisissez Projet, Ajouter une référence.On the menu bar, choose Project, Add Reference.

    La boîte de dialogue Gestionnaire de références s’affiche.The Reference Manager dialog box appears.

  3. En haut de la boîte de dialogue, vérifiez que votre projet cible .NET Framework 4.5 ou version ultérieure.At the top of the dialog box, verify that your project is targeting the .NET Framework 4.5 or higher.

  4. Dans la zone Assemblys, choisissez Framework s’il n’est pas déjà sélectionné.In the Assemblies area, choose Framework if it isn’t already chosen.

  5. Dans la liste de noms, cochez la case System.Net.Http.In the list of names, select the System.Net.Http check box.

  6. Choisissez le bouton OK pour fermer la boîte de dialogue.Choose the OK button to close the dialog box.

Ajouter les instructions Imports nécessairesAdd necessary Imports statements

  1. Dans Explorateur de solutions, ouvrez le menu contextuel de MainWindow. Xaml. vb, puis choisissez afficher le code.In Solution Explorer, open the shortcut menu for MainWindow.xaml.vb, and then choose View Code.

  2. Ajoutez les instructions Imports suivantes en haut du fichier de code, si elles ne sont pas déjà présentes.Add the following Imports statements at the top of the code file if they’re not already present.

    Imports System.Net.Http
    Imports System.Net
    Imports System.IO
    

Créer une application synchroneCreate a synchronous application

  1. Dans la fenêtre de conception, MainWindow. xaml, double-cliquez sur le bouton Démarrer pour startButton_Click créer le gestionnaire d’événements dans MainWindow. Xaml. vb.In the design window, MainWindow.xaml, double-click the Start button to create the startButton_Click event handler in MainWindow.xaml.vb.

  2. Dans MainWindow. Xaml. vb, copiez le code suivant dans le corps startButton_Clickde:In MainWindow.xaml.vb, copy the following code into the body of startButton_Click:

    resultsTextBox.Clear()
    SumPageSizes()
    resultsTextBox.Text &= vbCrLf & "Control returned to startButton_Click."
    

    Le code appelle la méthode qui pilote l'application, SumPageSizes, et affiche un message quand le contrôle redevient startButton_Click.The code calls the method that drives the application, SumPageSizes, and displays a message when control returns to startButton_Click.

  3. Le code de la solution synchrone contient les quatre méthodes suivantes :The code for the synchronous solution contains the following four methods:

    • SumPageSizes, qui obtient la liste des URL des pages web à partir de SetUpURLList, puis qui appelle GetURLContents et DisplayResults pour traiter chaque URL.SumPageSizes, which gets a list of webpage URLs from SetUpURLList and then calls GetURLContents and DisplayResults to process each URL.

    • SetUpURLList, qui dresse et retourne la liste des adresses web.SetUpURLList, which makes and returns a list of web addresses.

    • GetURLContents, qui télécharge le contenu de chaque site web et retourne le contenu sous la forme d'un tableau d'octets.GetURLContents, which downloads the contents of each website and returns the contents as a byte array.

    • DisplayResults, qui affiche le nombre d'octets dans le tableau d'octets pour chaque URL.DisplayResults, which displays the number of bytes in the byte array for each URL.

    Copiez les quatre méthodes suivantes, puis collez-les startButton_Click sous le gestionnaire d’événements dans MainWindow. Xaml. vb:Copy the following four methods, and then paste them under the startButton_Click event handler in MainWindow.xaml.vb:

    Private Sub SumPageSizes()
    
        ' Make a list of web addresses.
        Dim urlList As List(Of String) = SetUpURLList()
    
        Dim total = 0
        For Each url In urlList
            ' GetURLContents returns the contents of url as a byte array.
            Dim urlContents As Byte() = GetURLContents(url)
    
            DisplayResults(url, urlContents)
    
            ' Update the total.
            total += urlContents.Length
        Next
    
        ' Display the total count for all of the web addresses.
        resultsTextBox.Text &= String.Format(vbCrLf & vbCrLf & "Total bytes returned:  {0}" & vbCrLf, total)
    End Sub
    
    Private Function SetUpURLList() As List(Of String)
    
        Dim urls = New List(Of String) From
            {
                "https://msdn.microsoft.com/library/windows/apps/br211380.aspx",
                "https://msdn.microsoft.com",
                "https://msdn.microsoft.com/library/hh290136.aspx",
                "https://msdn.microsoft.com/library/ee256749.aspx",
                "https://msdn.microsoft.com/library/hh290138.aspx",
                "https://msdn.microsoft.com/library/hh290140.aspx",
                "https://msdn.microsoft.com/library/dd470362.aspx",
                "https://msdn.microsoft.com/library/aa578028.aspx",
                "https://msdn.microsoft.com/library/ms404677.aspx",
                "https://msdn.microsoft.com/library/ff730837.aspx"
            }
        Return urls
    End Function
    
    Private Function GetURLContents(url As String) As Byte()
    
        ' The downloaded resource ends up in the variable named content.
        Dim content = New MemoryStream()
    
        ' Initialize an HttpWebRequest for the current URL.
        Dim webReq = CType(WebRequest.Create(url), HttpWebRequest)
    
        ' Send the request to the Internet resource and wait for
        ' the response.
        ' Note: you can't use HttpWebRequest.GetResponse in a Windows Store app.
        Using response As WebResponse = webReq.GetResponse()
            ' Get the data stream that is associated with the specified URL.
            Using responseStream As Stream = response.GetResponseStream()
                ' Read the bytes in responseStream and copy them to content.
                responseStream.CopyTo(content)
            End Using
        End Using
    
        ' Return the result as a byte array.
        Return content.ToArray()
    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
    

Tester la solution synchroneTest the synchronous solution

  1. 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.

    Une sortie semblable à la liste suivante doit apparaître.Output that resembles the following list should appear.

    msdn.microsoft.com/library/windows/apps/br211380.aspx        383832
    msdn.microsoft.com                                            33964
    msdn.microsoft.com/library/hh290136.aspx               225793
    msdn.microsoft.com/library/ee256749.aspx               143577
    msdn.microsoft.com/library/hh290138.aspx               237372
    msdn.microsoft.com/library/hh290140.aspx               128279
    msdn.microsoft.com/library/dd470362.aspx               157649
    msdn.microsoft.com/library/aa578028.aspx               204457
    msdn.microsoft.com/library/ms404677.aspx               176405
    msdn.microsoft.com/library/ff730837.aspx               143474
    
    Total bytes returned:  1834802
    
    Control returned to startButton_Click.
    

    Notez que quelques secondes suffisent pour afficher les nombres.Notice that it takes a few seconds to display the counts. Pendant ce temps, le thread d'interface utilisateur est bloqué alors qu'il attend que les ressources demandées se téléchargent.During that time, the UI thread is blocked while it waits for requested resources to download. Par conséquent, vous ne pouvez pas déplacer, agrandir, réduire ni même fermer la fenêtre d’affichage une fois que vous avez choisi le bouton Démarrer.As a result, you can't move, maximize, minimize, or even close the display window after you choose the Start button. Ces efforts échouent jusqu'à ce que les nombres d'octets commencent à apparaître.These efforts fail until the byte counts start to appear. Si un site web ne répond pas, vous n'avez aucune indication précise sur le site en question qui a échoué.If a website isn’t responding, you have no indication of which site failed. Il est même difficile d'arrêter l'attente et de fermer le programme.It is difficult even to stop waiting and close the program.

Convertir GetURLContents en méthode asynchroneConvert GetURLContents to an asynchronous method

  1. Pour convertir la solution synchrone en solution asynchrone, le meilleur point de départ est de faire GetURLContents en sorte que les appels HttpWebRequest.GetResponse à la méthode et Stream.CopyTo à la méthode se trouvent là où l’application accède au Web.To convert the synchronous solution to an asynchronous solution, the best place to start is in GetURLContents because the calls to the HttpWebRequest.GetResponse method and to the Stream.CopyTo method are where the application accesses the web. Le .NET Framework facilite la conversion en fournissant des versions asynchrones des deux méthodes.The .NET Framework makes the conversion easy by supplying asynchronous versions of both methods.

    Pour plus d'informations sur les méthodes utilisées dans GetURLContents, consultez WebRequest.For more information about the methods that are used in GetURLContents, see WebRequest.

    Notes

    Quand vous suivez les étapes décrites dans cette procédure pas à pas, plusieurs erreurs de compilation apparaissent.As you follow the steps in this walkthrough, several compiler errors appear. Vous pouvez les ignorer et poursuivre la procédure.You can ignore them and continue with the walkthrough.

    Remplacez la méthode appelée à la troisième ligne de GetURLContents dont la valeur est GetResponse par la méthode GetResponseAsync asynchrone basée sur les tâches.Change the method that's called in the third line of GetURLContents from GetResponse to the asynchronous, task-based GetResponseAsync method.

    Using response As WebResponse = webReq.GetResponseAsync()
    
  2. GetResponseAsync retourne un Task<TResult>.GetResponseAsync returns a Task<TResult>. Dans ce cas, la variable de retour de tâche, TResult, est de type WebResponse.In this case, the task return variable, TResult, has type WebResponse. La tâche est une promesse de produire un objet WebResponse réel une fois que les données demandées ont été téléchargées et que la tâche s'est exécutée entièrement.The task is a promise to produce an actual WebResponse object after the requested data has been downloaded and the task has run to completion.

    Pour récupérer la WebResponse valeur de la tâche, appliquez un opérateur await à l’appel à GetResponseAsync, comme le montre le code suivant.To retrieve the WebResponse value from the task, apply an Await operator to the call to GetResponseAsync, as the following code shows.

    Using response As WebResponse = Await webReq.GetResponseAsync()
    

    L’opérateur Await suspend l’exécution de la méthode actuelle, GetURLContents, jusqu’à ce que la tâche attendue soit terminée.The Await operator suspends the execution of the current method, GetURLContents, until the awaited task is complete. Entre-temps, le contrôle retourne à l'appelant de la méthode actuelle.In the meantime, control returns to the caller of the current method. Dans cet exemple, la méthode actuelle est GetURLContents et l'appelant est SumPageSizes.In this example, the current method is GetURLContents, and the caller is SumPageSizes. Quand la tâche est terminée, l'objet WebResponse promis est produit sous forme de valeur de la tâche attendue et assigné à la variable response.When the task is finished, the promised WebResponse object is produced as the value of the awaited task and assigned to the variable response.

    L'instruction précédente peut être divisée en deux instructions suivantes pour clarifier ce qui se passe.The previous statement can be separated into the following two statements to clarify what happens.

    Dim responseTask As Task(Of WebResponse) = webReq.GetResponseAsync()
    Using response As WebResponse = Await responseTask
    

    L'appel à webReq.GetResponseAsync retourne un Task(Of WebResponse) ou Task<WebResponse>.The call to webReq.GetResponseAsync returns a Task(Of WebResponse) or Task<WebResponse>. Un Await opérateur est ensuite appliqué à la tâche pour récupérer la WebResponse valeur.Then an Await operator is applied to the task to retrieve the WebResponse value.

    Si votre méthode async a un travail à effectuer qui ne dépend pas de l'achèvement de la tâche, elle peut poursuivre ce travail entre ces deux instructions, après l'appel à la méthode async et avant l'application de l'opérateur await.If your async method has work to do that doesn’t depend on the completion of the task, the method can continue with that work between these two statements, after the call to the async method and before the await operator is applied. Pour obtenir des exemples, consultez Guide pratique pour Effectuez plusieurs requêtes Web en parallèle en utilisant Async et await (Visual Basic) et Comment: Étendez la procédure pas à pas Async à l’aide deTask. WhenAll (Visual Basic).For examples, see How to: Make Multiple Web Requests in Parallel by Using Async and Await (Visual Basic) and How to: Extend the Async Walkthrough by Using Task.WhenAll (Visual Basic).

  3. Comme vous avez ajouté l’opérateur Await à l’étape précédente, une erreur de compilation se produit.Because you added the Await operator in the previous step, a compiler error occurs. L’opérateur peut être utilisé uniquement dans les méthodes marquées avec le modificateur Async .The operator can be used only in methods that are marked with the Async modifier. Ignorez l'erreur quand que vous répétez les étapes de conversion pour remplacer l'appel à CopyTo par un appel à CopyToAsync.Ignore the error while you repeat the conversion steps to replace the call to CopyTo with a call to CopyToAsync.

    • Remplacez le nom de la méthode appelée par CopyToAsync.Change the name of the method that’s called to CopyToAsync.

    • La méthode CopyTo ou CopyToAsync copie les octets dans son argument, content, et ne retourne pas de valeur significative.The CopyTo or CopyToAsync method copies bytes to its argument, content, and doesn’t return a meaningful value. Dans la version synchrone, l'appel à CopyTo est une simple instruction qui ne retourne aucune valeur.In the synchronous version, the call to CopyTo is a simple statement that doesn't return a value. La version asynchrone, CopyToAsync, retourne un Task.The asynchronous version, CopyToAsync, returns a Task. La tâche fonctionne comme Task(void) et permet à la méthode d'être attendue.The task functions like "Task(void)" and enables the method to be awaited. Appliquez Await ou await à l'appel à CopyToAsync, comme le montre le code suivant.Apply Await or await to the call to CopyToAsync, as the following code shows.

      Await responseStream.CopyToAsync(content)
      

      L'instruction précédente abrège les deux lignes de code suivantes.The previous statement abbreviates the following two lines of code.

      ' CopyToAsync returns a Task, not a Task<T>.
      Dim copyTask As Task = responseStream.CopyToAsync(content)
      
      ' When copyTask is completed, content contains a copy of
      ' responseStream.
      Await copyTask
      
  4. Tout ce qui reste à faire dans GetURLContents consiste à adapter la signature de la méthode.All that remains to be done in GetURLContents is to adjust the method signature. Vous pouvez utiliser l' Await opérateur uniquement dans les méthodes marquées avec le modificateur Async .You can use the Await operator only in methods that are marked with the Async modifier. Ajoutez le modificateur pour marquer la méthode en tant que méthode async, comme le montre le code suivant.Add the modifier to mark the method as an async method, as the following code shows.

    Private Async Function GetURLContents(url As String) As Byte()
    
  5. Le type de retour d’une méthode Async peut uniquement Taskêtre Task<TResult>,.The return type of an async method can only be Task, Task<TResult>. En Visual Basic, la méthode doit être un Function qui retourne un Task ou Task(Of T), ou la méthode doit être un Sub.In Visual Basic, the method must be a Function that returns a Task or a Task(Of T), or the method must be a Sub. En règle générale Sub , une méthode est utilisée uniquement dans un gestionnaire d’événements Sub Async, où est requis.Typically, a Sub method is used only in an async event handler, where Sub is required. Dans d’autres cas, vous utilisez Task(T) si la méthode terminée a une instruction RETURN qui retourne une valeur de type T et que vous utilisez Task si la méthode terminée ne retourne pas de valeur significative.In other cases, you use Task(T) if the completed method has a Return statement that returns a value of type T, and you use Task if the completed method doesn’t return a meaningful value.

    Pour plus d’informations, consultez types de retour Async (Visual Basic).For more information, see Async Return Types (Visual Basic).

    La méthode GetURLContents comporte une instruction return et l'instruction retourne un tableau d'octets.Method GetURLContents has a return statement, and the statement returns a byte array. Ainsi, le type de retour de la version asynchrone est Task(T), où T est un tableau d'octets.Therefore, the return type of the async version is Task(T), where T is a byte array. Apportez les modifications suivantes dans la signature de la méthode :Make the following changes in the method signature:

    • Remplacez le type de retour par Task(Of Byte()).Change the return type to Task(Of Byte()).

    • Par convention, les méthodes asynchrones portent des noms qui se terminent par « Async ». Renommez alors la méthode GetURLContentsAsync.By convention, asynchronous methods have names that end in "Async," so rename the method GetURLContentsAsync.

    Le code suivant illustre ces modifications.The following code shows these changes.

    Private Async Function GetURLContentsAsync(url As String) As Task(Of Byte())
    

    Avec ces quelques modifications, la conversion de GetURLContents en méthode asynchrone est terminée.With those few changes, the conversion of GetURLContents to an asynchronous method is complete.

Convertir SumPageSizes en méthode asynchroneConvert SumPageSizes to an asynchronous method

  1. Répétez les étapes de la procédure précédente pour SumPageSizes.Repeat the steps from the previous procedure for SumPageSizes. Tout d'abord, modifiez l'appel à GetURLContents en appel asynchrone.First, change the call to GetURLContents to an asynchronous call.

    • Remplacez le nom de la méthode appelée GetURLContents par GetURLContentsAsync, si vous ne l'avez pas déjà fait.Change the name of the method that’s called from GetURLContents to GetURLContentsAsync, if you haven't already done so.

    • Appliquez Await à la tâche que GetURLContentsAsync retourne pour obtenir la valeur du tableau d’octets.Apply Await to the task that GetURLContentsAsync returns to obtain the byte array value.

    Le code suivant illustre ces modifications.The following code shows these changes.

    Dim urlContents As Byte() = Await GetURLContentsAsync(url)
    

    L'instruction précédente abrège les deux lignes de code suivantes.The previous assignment abbreviates the following two lines of code.

    ' GetURLContentsAsync returns a task. At completion, the task
    ' produces a byte array.
    Dim getContentsTask As Task(Of Byte()) = GetURLContentsAsync(url)
    Dim urlContents As Byte() = Await getContentsTask
    
  2. Apportez les modifications suivantes dans la signature de la méthode :Make the following changes in the method's signature:

    • Marquez la méthode avec le modificateur Async.Mark the method with the Async modifier.

    • Ajoutez « Async » au nom de la méthode.Add "Async" to the method name.

    • Il n'existe aucune variable de retour de tâche, T, cette fois, car SumPageSizesAsync ne retourne pas de valeur pour T. (La méthode ne comporte pas d’instruction Return.) Toutefois, la méthode doit retourner un Task pour pouvoir être attendue.There is no task return variable, T, this time because SumPageSizesAsync doesn’t return a value for T. (The method has no Return statement.) However, the method must return a Task to be awaitable. Par conséquent, remplacez le type Sub Functionde méthode par.Therefore, change the method type from Sub to Function. Le type de retour de la fonction est Task.The return type of the function is Task.

    Le code suivant illustre ces modifications.The following code shows these changes.

    Private Async Function SumPageSizesAsync() As Task
    

    La conversion de SumPageSizes en SumPageSizesAsync est terminée.The conversion of SumPageSizes to SumPageSizesAsync is complete.

Convertir startButton_Click en méthode asynchroneConvert startButton_Click to an asynchronous method

  1. Dans le gestionnaire d'événements, remplacez le nom de la méthode appelée SumPageSizes par SumPageSizesAsync, si vous ne l'avez pas déjà fait.In the event handler, change the name of the called method from SumPageSizes to SumPageSizesAsync, if you haven’t already done so.

  2. Étant donné que SumPageSizesAsync est une méthode async, modifiez le code dans le gestionnaire d'événements de sorte à attendre le résultat.Because SumPageSizesAsync is an async method, change the code in the event handler to await the result.

    L'appel à SumPageSizesAsync reflète l'appel à CopyToAsync dans GetURLContentsAsync.The call to SumPageSizesAsync mirrors the call to CopyToAsync in GetURLContentsAsync. L'appel retourne un Task, et non un Task(T).The call returns a Task, not a Task(T).

    Comme dans les procédures précédentes, vous pouvez convertir l'appel à l'aide d'une ou deux instructions.As in previous procedures, you can convert the call by using one statement or two statements. Le code suivant illustre ces modifications.The following code shows these changes.

    ' One-step async call.
    Await SumPageSizesAsync()
    
    ' Two-step async call.
    Dim sumTask As Task = SumPageSizesAsync()
    Await sumTask
    
  3. Pour empêcher une nouvelle entrée accidentelle de l’opération, ajoutez l’instruction suivante en haut de startButton_Click pour désactiver le bouton Démarrer.To prevent accidentally reentering the operation, add the following statement at the top of startButton_Click to disable the Start button.

    ' Disable the button until the operation is complete.
    startButton.IsEnabled = False
    

    Vous pouvez réactiver le bouton à la fin du gestionnaire d'événements.You can reenable the button at the end of the event handler.

    ' Reenable the button in case you want to run the operation again.
    startButton.IsEnabled = True
    

    Pour plus d’informations sur la réentrance, consultez gestion de la réentrance dans les applications Async (Visual Basic).For more information about reentrancy, see Handling Reentrancy in Async Apps (Visual Basic).

  4. Enfin, ajoutez le modificateur Async à la déclaration pour que le gestionnaire d’événements puisse attendre SumPagSizesAsync.Finally, add the Async modifier to the declaration so that the event handler can await SumPagSizesAsync.

    Async Sub startButton_Click(sender As Object, e As RoutedEventArgs) Handles startButton.Click
    

    En règle générale, les noms des gestionnaires d'événements ne sont pas modifiés.Typically, the names of event handlers aren’t changed. Le type de retour n’est Task pas remplacé par car les gestionnaires Sub d’événements doivent être des procédures dans Visual Basic.The return type isn’t changed to Task because event handlers must be Sub procedures in Visual Basic.

    La conversion du projet depuis un traitement synchrone vers un traitement asynchrone est terminée.The conversion of the project from synchronous to asynchronous processing is complete.

Tester la solution asynchroneTest the asynchronous solution

  1. 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.

  2. Une sortie semblable à la sortie de la solution synchrone doit apparaître.Output that resembles the output of the synchronous solution should appear. En revanche, observez les différences ci-après.However, notice the following differences.

    • Les résultats ne se produisent pas tous en même temps, une fois le traitement terminé.The results don’t all occur at the same time, after the processing is complete. Par exemple, les deux programmes contiennent une ligne dans startButton_Click qui efface la zone de texte.For example, both programs contain a line in startButton_Click that clears the text box. L’objectif est d’effacer la zone de texte entre les exécutions si vous choisissez le bouton Démarrer une deuxième fois, une fois qu’un jeu de résultats est apparu.The intent is to clear the text box between runs if you choose the Start button for a second time, after one set of results has appeared. Dans la version synchrone, la zone de texte s’efface juste avant que les nombres n’apparaissent pour la deuxième fois, quand les téléchargements sont terminés et que le thread d’interface utilisateur est libre d’effectuer autre chose.In the synchronous version, the text box is cleared just before the counts appear for the second time, when the downloads are completed and the UI thread is free to do other work. Dans la version asynchrone, la zone de texte s’efface immédiatement après avoir choisi le bouton Démarrer.In the asynchronous version, the text box clears immediately after you choose the Start button.

    • Plus important encore, le thread d'interface utilisateur n'est pas bloqué pendant les téléchargements.Most importantly, the UI thread isn’t blocked during the downloads. Vous pouvez déplacer ou redimensionner la fenêtre pendant le téléchargement, la comptabilisation et l'affichage des ressources web.You can move or resize the window while the web resources are being downloaded, counted, and displayed. Si l’un des sites web est lent ou ne répond pas, vous pouvez annuler l’opération en choisissant le bouton Fermer (le x dans le champ rouge situé dans le coin supérieur droit).If one of the websites is slow or not responding, you can cancel the operation by choosing the Close button (the x in the red field in the upper-right corner).

Remplacer la méthode GetURLContentsAsync par une méthode .NET FrameworkReplace the GetURLContentsAsync method with a .NET Framework method

  1. Le .NET Framework fournit de nombreuses méthodes Async que vous pouvez utiliser.The .NET Framework provides many async methods that you can use. L’une d’entre elles HttpClient.GetByteArrayAsync(String) , la méthode, fait exactement ce dont vous avez besoin pour cette procédure pas à pas.One of them, the HttpClient.GetByteArrayAsync(String) method, does just what you need for this walkthrough. Vous pouvez l'utiliser à la place de la méthode GetURLContentsAsync que vous avez créée précédemment.You can use it instead of the GetURLContentsAsync method that you created in an earlier procedure.

    La première étape consiste à créer un HttpClient objet dans la SumPageSizesAsync méthode.The first step is to create an HttpClient object in the SumPageSizesAsync method. Ajoutez la déclaration suivante au début de la méthode.Add the following declaration at the start of the method.

    ' 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}
    
  2. Dans SumPageSizesAsync,, remplacez l'appel à votre méthode GetURLContentsAsync par un appel à la méthode HttpClient.In SumPageSizesAsync, replace the call to your GetURLContentsAsync method with a call to the HttpClient method.

    Dim urlContents As Byte() = Await client.GetByteArrayAsync(url)
    
  3. Supprimez ou commentez la méthode GetURLContentsAsync que vous avez écrite.Remove or comment out the GetURLContentsAsync method that you wrote.

  4. 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.

    Le comportement de cette version du projet doit correspondre à celui décrit par la procédure « Pour tester la solution asynchrone » mais avec encore moins d'efforts de votre part.The behavior of this version of the project should match the behavior that the "To test the asynchronous solution" procedure describes but with even less effort from you.

ExemplesExample

Voici l’exemple complet de la solution asynchrone convertie qui utilise la méthode GetURLContentsAsync asynchrone.The following is the full example of the converted asynchronous solution that uses the asynchronous GetURLContentsAsync method. Remarquez qu’il ressemble fortement à la solution synchrone d’origine.Notice that it strongly resembles the original, synchronous solution.

' Add the following Imports statements, and add a reference for System.Net.Http.
Imports System.Net.Http
Imports System.Net
Imports System.IO

Class MainWindow

    Async Sub startButton_Click(sender As Object, e As RoutedEventArgs) Handles startButton.Click

        ' Disable the button until the operation is complete.
        startButton.IsEnabled = False

        resultsTextBox.Clear()

        '' One-step async call.
        Await SumPageSizesAsync()

        ' Two-step async call.
        'Dim sumTask As Task = SumPageSizesAsync()
        'Await sumTask

        resultsTextBox.Text &= vbCrLf & "Control returned to button1_Click."

        ' Reenable the button in case you want to run the operation again.
        startButton.IsEnabled = True
    End Sub

    Private Async Function SumPageSizesAsync() As Task

        ' Make a list of web addresses.
        Dim urlList As List(Of String) = SetUpURLList()

        Dim total = 0
        For Each url In urlList
            Dim urlContents As Byte() = Await GetURLContentsAsync(url)

            ' The previous line abbreviates the following two assignment statements.

            '//<snippet21>
            ' GetURLContentsAsync returns a task. At completion, the task
            ' produces a byte array.
            'Dim getContentsTask As Task(Of Byte()) = GetURLContentsAsync(url)
            'Dim urlContents As Byte() = Await getContentsTask

            DisplayResults(url, urlContents)

            ' Update the total.
            total += urlContents.Length
        Next

        ' Display the total count for all of the websites.
        resultsTextBox.Text &= String.Format(vbCrLf & vbCrLf &
                                             "Total bytes returned:  {0}" & vbCrLf, total)
    End Function

    Private Function SetUpURLList() As List(Of String)

        Dim urls = New List(Of String) From
            {
                "https://msdn.microsoft.com/library/windows/apps/br211380.aspx",
                "https://msdn.microsoft.com",
                "https://msdn.microsoft.com/library/hh290136.aspx",
                "https://msdn.microsoft.com/library/ee256749.aspx",
                "https://msdn.microsoft.com/library/hh290138.aspx",
                "https://msdn.microsoft.com/library/hh290140.aspx",
                "https://msdn.microsoft.com/library/dd470362.aspx",
                "https://msdn.microsoft.com/library/aa578028.aspx",
                "https://msdn.microsoft.com/library/ms404677.aspx",
                "https://msdn.microsoft.com/library/ff730837.aspx"
            }
        Return urls
    End Function

    Private Async Function GetURLContentsAsync(url As String) As Task(Of Byte())

        ' The downloaded resource ends up in the variable named content.
        Dim content = New MemoryStream()

        ' Initialize an HttpWebRequest for the current URL.
        Dim webReq = CType(WebRequest.Create(url), HttpWebRequest)

        ' Send the request to the Internet resource and wait for
        ' the response.
        Using response As WebResponse = Await webReq.GetResponseAsync()

            ' The previous statement abbreviates the following two statements.

            'Dim responseTask As Task(Of WebResponse) = webReq.GetResponseAsync()
            'Using response As WebResponse = Await responseTask

            ' Get the data stream that is associated with the specified URL.
            Using responseStream As Stream = response.GetResponseStream()
                ' Read the bytes in responseStream and copy them to content.
                Await responseStream.CopyToAsync(content)

                ' The previous statement abbreviates the following two statements.

                ' CopyToAsync returns a Task, not a Task<T>.
                'Dim copyTask As Task = responseStream.CopyToAsync(content)

                ' When copyTask is completed, content contains a copy of
                ' responseStream.
                'Await copyTask
            End Using
        End Using

        ' Return the result as a byte array.
        Return content.ToArray()
    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

Le code suivant inclut l'exemple complet de la solution qui utilise la méthode HttpClient, GetByteArrayAsync.The following code contains the full example of the solution that uses the HttpClient method, GetByteArrayAsync.

' Add the following Imports statements, and add a reference for System.Net.Http.
Imports System.Net.Http
Imports System.Net
Imports System.IO

Class MainWindow

    Async Sub startButton_Click(sender As Object, e As RoutedEventArgs) Handles startButton.Click

        resultsTextBox.Clear()

        ' Disable the button until the operation is complete.
        startButton.IsEnabled = False

        ' One-step async call.
        Await SumPageSizesAsync()

        ' Two-step async call.
        'Dim sumTask As Task = SumPageSizesAsync()
        'Await sumTask

        resultsTextBox.Text &= vbCrLf & "Control returned to button1_Click."

        ' Reenable the button in case you want to run the operation again.
        startButton.IsEnabled = True
    End Sub

    Private Async Function SumPageSizesAsync() 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}

        ' Make a list of web addresses.
        Dim urlList As List(Of String) = SetUpURLList()

        Dim total = 0
        For Each url In urlList
            ' GetByteArrayAsync returns a task. At completion, the task
            ' produces a byte array.
            Dim urlContents As Byte() = Await client.GetByteArrayAsync(url)

            ' The following two lines can replace the previous assignment statement.
            'Dim getContentsTask As Task(Of Byte()) = client.GetByteArrayAsync(url)
            'Dim urlContents As Byte() = Await getContentsTask

            DisplayResults(url, urlContents)

            ' Update the total.
            total += urlContents.Length
        Next

        ' Display the total count for all of the websites.
        resultsTextBox.Text &= String.Format(vbCrLf & vbCrLf &
                                             "Total bytes returned:  {0}" & vbCrLf, total)
    End Function

    Private Function SetUpURLList() As List(Of String)

        Dim urls = New List(Of String) From
            {
                "https://msdn.microsoft.com/library/windows/apps/br211380.aspx",
                "https://msdn.microsoft.com",
                "https://msdn.microsoft.com/library/hh290136.aspx",
                "https://msdn.microsoft.com/library/ee256749.aspx",
                "https://msdn.microsoft.com/library/hh290138.aspx",
                "https://msdn.microsoft.com/library/hh290140.aspx",
                "https://msdn.microsoft.com/library/dd470362.aspx",
                "https://msdn.microsoft.com/library/aa578028.aspx",
                "https://msdn.microsoft.com/library/ms404677.aspx",
                "https://msdn.microsoft.com/library/ff730837.aspx"
            }
        Return urls
    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