Programmation asynchrone avec Async et Await (Visual Basic)Asynchronous Programming with Async and Await (Visual Basic)

Vous pouvez éviter des goulots d'étranglement de performance et améliorer la réactivité globale de votre application à l'aide de la programmation asynchrone.You can avoid performance bottlenecks and enhance the overall responsiveness of your application by using asynchronous programming. Toutefois, les techniques traditionnelles pour écrire des applications asynchrones peuvent être complexes et rendre ces applications difficiles à écrire, déboguer et mettre à jour.However, traditional techniques for writing asynchronous applications can be complicated, making them difficult to write, debug, and maintain.

Visual Studio 2012 a introduit une approche simplifiée, la programmation async, qui tire parti de la prise en charge asynchrone de .NET Framework 4.5 et des versions ultérieures ainsi que de Windows Runtime.Visual Studio 2012 introduced a simplified approach, async programming, that leverages asynchronous support in the .NET Framework 4.5 and higher as well as in the Windows Runtime. Le compilateur effectue le travail difficile dont se chargeait le développeur jusqu’à maintenant. En outre, votre application conserve une structure logique qui ressemble à du code synchrone.The compiler does the difficult work that the developer used to do, and your application retains a logical structure that resembles synchronous code. Par conséquent, vous obtenez tous les avantages de la programmation asynchrone avec peu d'effort.As a result, you get all the advantages of asynchronous programming with a fraction of the effort.

Cette rubrique fournit une vue d'ensemble sur quand et comment utiliser la programmation asynchrone, et inclut des liens vers des rubriques du support, qui contiennent des informations et des exemples.This topic provides an overview of when and how to use async programming and includes links to support topics that contain details and examples.

Async améliore la réactivitéAsync Improves Responsiveness

Le comportement asynchrone est essentiel pour les activités qui sont potentiellement bloquantes, par exemple lorsque votre application accède au Web.Asynchrony is essential for activities that are potentially blocking, such as when your application accesses the web. L'accès à une ressource Web est parfois lent ou différé.Access to a web resource sometimes is slow or delayed. Si cette activité est bloquée dans un processus synchrone, l'application entière doit attendre.If such an activity is blocked within a synchronous process, the entire application must wait. Dans un processus asynchrone, l'application peut poursuivre une autre tâche qui ne dépend pas de la ressource Web jusqu'à ce que la tâche potentiellement bloquante soit terminée.In an asynchronous process, the application can continue with other work that doesn't depend on the web resource until the potentially blocking task finishes.

Le tableau suivant indique les zones classiques où la programmation asynchrone améliore la réactivité.The following table shows typical areas where asynchronous programming improves responsiveness. Les API répertoriées de .NET Framework 4.5 et de Windows Runtime contiennent des méthodes qui prennent en charge la programmation async.The listed APIs from the .NET Framework 4.5 and the Windows Runtime contain methods that support async programming.

Domaine d'applicationApplication area API de prise en charge qui contiennent des méthodes asyncSupporting APIs that contain async methods
Accès WebWeb access HttpClient, SyndicationClientHttpClient, SyndicationClient
Utilisation de fichiersWorking with files StorageFile, StreamWriter, StreamReader, XmlReaderStorageFile, StreamWriter, StreamReader, XmlReader
Utilisation d'imagesWorking with images MediaCapture, BitmapEncoder, BitmapDecoderMediaCapture, BitmapEncoder, BitmapDecoder
Programmation WCFWCF programming Opérations synchrones et asynchronesSynchronous and Asynchronous Operations

Le comportement asynchrone est particulièrement utile pour les applications qui accèdent au thread d'interface utilisateur, car toute activité liée à l'interface utilisateur partage généralement un thread.Asynchrony proves especially valuable for applications that access the UI thread because all UI-related activity usually shares one thread. Si un processus est bloqué dans une application synchrone, tous les processus sont bloqués.If any process is blocked in a synchronous application, all are blocked. Votre application ne répond plus et vous pouvez conclure qu'elle a rencontré une défaillance, alors qu'elle attend simplement.Your application stops responding, and you might conclude that it has failed when instead it's just waiting.

Lorsque vous utilisez des méthodes asynchrones, l'application continue à répondre à l'interface utilisateur.When you use asynchronous methods, the application continues to respond to the UI. Vous pouvez redimensionner ou réduire une fenêtre, par exemple, ou vous pouvez fermer l'application si vous ne souhaitez pas attendre qu'elle se termine.You can resize or minimize a window, for example, or you can close the application if you don't want to wait for it to finish.

L'approche basée sur async ajoute l'équivalent d'une transmission automatique à la liste d'options dont vous disposez pour concevoir des opérations asynchrones.The async-based approach adds the equivalent of an automatic transmission to the list of options that you can choose from when designing asynchronous operations. En d'autres termes, vous obtenez tous les avantages de la programmation asynchrone classique mais avec beaucoup moins d'efforts du point de vue du développeur.That is, you get all the benefits of traditional asynchronous programming but with much less effort from the developer.

Les méthodes Async sont plus faciles à écrireAsync Methods Are Easier to Write

Les mots clés async et await en Visual Basic sont au cœur de la programmation async.The Async and Await keywords in Visual Basic are the heart of async programming. Avec ces deux mots clés, vous pouvez utiliser des ressources dans .NET Framework ou Windows Runtime pour créer une méthode asynchrone presque aussi facilement qu’une méthode synchrone.By using those two keywords, you can use resources in the .NET Framework or the Windows Runtime to create an asynchronous method almost as easily as you create a synchronous method. Les méthodes asynchrones définies avec Async et Await sont appelées méthodes async.Asynchronous methods that you define by using Async and Await are referred to as async methods.

L'exemple suivant illustre une méthode async.The following example shows an async method. Presque tous les éléments du code doivent vous sembler familiers.Almost everything in the code should look completely familiar to you. Les commentaires indiquent les fonctionnalités que vous ajoutez pour créer le comportement asynchrone.The comments call out the features that you add to create the asynchrony.

Le fichier d’exemple complet Windows Presentation Foundation (WPF) se trouve à la fin de cette rubrique. Vous pouvez télécharger l’exemple sur Exemple async : exemple de « Programmation asynchrone avec Async et Await ».You can find a complete Windows Presentation Foundation (WPF) example file at the end of this topic, and you can download the sample from Async Sample: Example from "Asynchronous Programming with Async and Await".

' Three things to note in the signature:
'  - The method has an Async modifier.
'  - The return type is Task or Task(Of T). (See "Return Types" section.)
'    Here, it is Task(Of Integer) because the return statement returns an integer.
'  - The method name ends in "Async."
Async Function AccessTheWebAsync() As Task(Of Integer)

    ' You need to add a reference to System.Net.Http to declare client.
    Dim client As HttpClient = New HttpClient()

    ' GetStringAsync returns a Task(Of String). That means that when you await the
    ' task you'll get a string (urlContents).
    Dim getStringTask As Task(Of String) = client.GetStringAsync("https://msdn.microsoft.com")

    ' You can do work here that doesn't rely on the string from GetStringAsync.
    DoIndependentWork()

    ' The Await operator suspends AccessTheWebAsync.
    '  - AccessTheWebAsync can't continue until getStringTask is complete.
    '  - Meanwhile, control returns to the caller of AccessTheWebAsync.
    '  - Control resumes here when getStringTask is complete.
    '  - The Await operator then retrieves the string result from getStringTask.
    Dim urlContents As String = Await getStringTask

    ' The return statement specifies an integer result.
    ' Any methods that are awaiting AccessTheWebAsync retrieve the length value.
    Return urlContents.Length
End Function

Si AccessTheWebAsync n'a aucun travail qu'il peut effectuer entre l'appel de GetStringAsync et l'attente de son achèvement, vous pouvez simplifier votre code en appelant et attendant dans l'instruction unique suivante.If AccessTheWebAsync doesn't have any work that it can do between calling GetStringAsync and awaiting its completion, you can simplify your code by calling and awaiting in the following single statement.

Dim urlContents As String = Await client.GetStringAsync()

Les caractéristiques suivantes résument ce qui fait de l'exemple précédent une méthode async.The following characteristics summarize what makes the previous example an async method.

  • La signature de la méthode inclut un modificateur Async.The method signature includes an Async modifier.

  • Le nom d'une méthode async, par convention, se termine par un suffixe « Async ».The name of an async method, by convention, ends with an "Async" suffix.

  • Le type de retour est l'un des types suivants :The return type is one of the following types:

    • Task<TResult> si votre méthode a une instruction de retour dans laquelle l'opérande a le type TResult.Task<TResult> if your method has a return statement in which the operand has type TResult.

    • Task si votre méthode n'a aucune instruction de retour, ou si elle a une instruction de retour sans opérande.Task if your method has no return statement or has a return statement with no operand.

    • Sub si vous écrivez un gestionnaire d’événements async.Sub if you're writing an async event handler.

    Pour plus d’informations, consultez « Types et paramètres de retour » dans la suite de cette rubrique.For more information, see "Return Types and Parameters" later in this topic.

  • La méthode inclut généralement au moins une expression await, qui marque le point au-delà duquel la méthode ne peut pas poursuivre son exécution tant que l'opération asynchrone attendue n'est pas terminée.The method usually includes at least one await expression, which marks a point where the method can't continue until the awaited asynchronous operation is complete. Dans le même temps, la méthode est interrompue, et le contrôle retourne à l'appelant de la méthode.In the meantime, the method is suspended, and control returns to the method's caller. La section suivante de cette rubrique illustre ce qui se produit au point d'interruption.The next section of this topic illustrates what happens at the suspension point.

Dans les méthodes async, vous utilisez les mots clés et les types fournis pour indiquer ce que vous souhaitez faire, et le compilateur effectue le reste, notamment le suivi de ce qui doit se produire lorsque le contrôle retourne à un point d'attente dans une méthode interrompue.In async methods, you use the provided keywords and types to indicate what you want to do, and the compiler does the rest, including keeping track of what must happen when control returns to an await point in a suspended method. Il peut être difficile de gérer des processus de routine, tels que les boucles et la gestion des exceptions, dans le code asynchrone traditionnel.Some routine processes, such as loops and exception handling, can be difficult to handle in traditional asynchronous code. Dans une méthode async, vous écrivez ces éléments comme vous l’auriez fait dans une solution synchrone, et le problème est résolu.In an async method, you write these elements much as you would in a synchronous solution, and the problem is solved.

Pour plus d’informations sur le comportement asynchrone dans les versions antérieures de .NET Framework, consultez la page Programmation asynchrone .NET Framework traditionnelle et TPL.For more information about asynchrony in previous versions of the .NET Framework, see TPL and Traditional .NET Framework Asynchronous Programming.

Ce qui se produit dans une méthode AsyncWhat Happens in an Async Method

La chose la plus importante à comprendre en programmation asynchrone est le déplacement du flux de contrôle d'une méthode à l'autre.The most important thing to understand in asynchronous programming is how the control flow moves from method to method. Le diagramme suivant vous guide à travers le processus.The following diagram leads you through the process.

Diagramme illustrant le suivi d’un programme asynchrone.

Les numéros du diagramme correspondent aux étapes suivantes.The numbers in the diagram correspond to the following steps.

  1. Un gestionnaire d'événements appelle et attend la méthode async AccessTheWebAsync.An event handler calls and awaits the AccessTheWebAsync async method.

  2. AccessTheWebAsync crée une instance HttpClient et appelle la méthode asynchrone GetStringAsync pour télécharger le contenu d'un site Web comme une chaîne.AccessTheWebAsync creates an HttpClient instance and calls the GetStringAsync asynchronous method to download the contents of a website as a string.

  3. Quelque chose se produit dans GetStringAsync et suspend sa progression.Something happens in GetStringAsync that suspends its progress. Elle peut être obligée d'attendre la fin d'un téléchargement sur un site Web ou de toute autre activité bloquante.Perhaps it must wait for a website to download or some other blocking activity. Pour éviter de bloquer les ressources, GetStringAsync cède le contrôle à son appelant, AccessTheWebAsync.To avoid blocking resources, GetStringAsync yields control to its caller, AccessTheWebAsync.

    GetStringAsync retourne un Task<TResult> où TResult est une chaîne et AccessTheWebAsync assigne la tâche à la variable getStringTask.GetStringAsync returns a Task<TResult> where TResult is a string, and AccessTheWebAsync assigns the task to the getStringTask variable. La tâche représente le processus en cours de l'appel de GetStringAsync, avec l'engagement de produire une valeur de chaîne réelle lorsque le travail est terminé.The task represents the ongoing process for the call to GetStringAsync, with a commitment to produce an actual string value when the work is complete.

  4. Étant donné que getStringTask n'a pas encore été attendu, AccessTheWebAsync peut continuer avec un autre travail qui ne dépend pas du résultat final issu de GetStringAsync.Because getStringTask hasn't been awaited yet, AccessTheWebAsync can continue with other work that doesn't depend on the final result from GetStringAsync. Cette opération est représentée par un appel à la méthode synchrone DoIndependentWork.That work is represented by a call to the synchronous method DoIndependentWork.

  5. DoIndependentWork est une méthode synchrone qui effectue son travail et retourne à son appelant.DoIndependentWork is a synchronous method that does its work and returns to its caller.

  6. AccessTheWebAsync n'a plus de travail à exécuter sans un résultat de getStringTask.AccessTheWebAsync has run out of work that it can do without a result from getStringTask. AccessTheWebAsync veut ensuite calculer et retourner la longueur de la chaîne téléchargée, mais la méthode ne peut pas calculer cette valeur avant d'avoir la chaîne.AccessTheWebAsync next wants to calculate and return the length of the downloaded string, but the method can't calculate that value until the method has the string.

    Par conséquent, AccessTheWebAsync utilise un opérateur await pour interrompre sa progression et pour céder le contrôle à la méthode ayant appelé AccessTheWebAsync.Therefore, AccessTheWebAsync uses an await operator to suspend its progress and to yield control to the method that called AccessTheWebAsync. AccessTheWebAsyncRetourne un Task<int> (Task(Of Integer) en Visual Basic) à l’appelant.AccessTheWebAsync returns a Task<int> (Task(Of Integer) in Visual Basic) to the caller. La tâche représente la promesse de produire un résultat entier qui est la longueur de la chaîne téléchargée.The task represents a promise to produce an integer result that's the length of the downloaded string.

    Notes

    Si GetStringAsync (et donc getStringTask) est terminé avant que AccessTheWebAsync ne l'attende, le contrôle reste dans AccessTheWebAsync.If GetStringAsync (and therefore getStringTask) is complete before AccessTheWebAsync awaits it, control remains in AccessTheWebAsync. Le fait de suspendre, puis de retourner à AccessTheWebAsync ne sert à rien si le processus asynchrone appelé (getStringTask) s'est déjà effectué et si AccessTheWebSync n'a pas à attendre le résultat final.The expense of suspending and then returning to AccessTheWebAsync would be wasted if the called asynchronous process (getStringTask) has already completed and AccessTheWebSync doesn't have to wait for the final result.

    Dans l'appelant (le gestionnaire d'événements dans cet exemple), le modèle de traitement continue.Inside the caller (the event handler in this example), the processing pattern continues. L'appelant peut effectuer d'autres tâches qui ne dépendent pas du résultat de AccessTheWebAsync avant d'attendre ce résultat, ou l'appelant peut attendre immédiatement.The caller might do other work that doesn't depend on the result from AccessTheWebAsync before awaiting that result, or the caller might await immediately. Le gestionnaire d'événements attend AccessTheWebAsync, et AccessTheWebAsync attend GetStringAsync.The event handler is waiting for AccessTheWebAsync, and AccessTheWebAsync is waiting for GetStringAsync.

  7. GetStringAsync se termine et génère un résultat de chaîne.GetStringAsync completes and produces a string result. Le résultat de chaîne n'est pas retourné par l'appel de GetStringAsync de la façon à laquelle vous pourriez vous attendre.The string result isn't returned by the call to GetStringAsync in the way that you might expect. N’oubliez pas que la méthode a déjà retourné une tâche à l’étape 3. Au lieu de cela, la chaîne résultante est stockée dans la tâche qui représente l’achèvement de la méthode, getStringTask.(Remember that the method already returned a task in step 3.) Instead, the string result is stored in the task that represents the completion of the method, getStringTask. L'opérateur await récupère le résultat de getStringTask.The await operator retrieves the result from getStringTask. L'instruction d'assignation assigne le résultat récupéré à urlContents.The assignment statement assigns the retrieved result to urlContents.

  8. Lorsque AccessTheWebAsync a le résultat de chaîne, la méthode peut calculer la longueur de la chaîne.When AccessTheWebAsync has the string result, the method can calculate the length of the string. Puis, le travail d'AccessTheWebAsync est également interrompu, et le gestionnaire d'événements en attente peut reprendre.Then the work of AccessTheWebAsync is also complete, and the waiting event handler can resume. Dans l'exemple complet à la fin de la rubrique, vous pouvez vérifier que le gestionnaire d'événements récupère et imprime la valeur du résultat de la longueur.In the full example at the end of the topic, you can confirm that the event handler retrieves and prints the value of the length result.

Si vous débutez en programmation asynchrone, prenez une minute pour déterminer la différence entre le comportement synchrone et le comportement asynchrone.If you are new to asynchronous programming, take a minute to consider the difference between synchronous and asynchronous behavior. Une méthode synchrone retourne une fois son travail terminé (étape 5), mais une méthode asynchrone retourne une valeur de tâche lorsque son travail est interrompu (étapes 3 et 6).A synchronous method returns when its work is complete (step 5), but an async method returns a task value when its work is suspended (steps 3 and 6). Lorsque la méthode async termine finalement son travail, la tâche est marquée comme terminée et le résultat, le cas échéant, est stocké dans la tâche.When the async method eventually completes its work, the task is marked as completed and the result, if any, is stored in the task.

Pour plus d’informations sur le flux de contrôle, consultez la page Flux de contrôle dans les programmes async (Visual Basic).For more information about control flow, see Control Flow in Async Programs (Visual Basic).

Méthodes async d’APIAPI Async Methods

Vous pouvez vous demander où rechercher les méthodes telles que GetStringAsync qui prennent en charge la programmation async.You might be wondering where to find methods such as GetStringAsync that support async programming. .NET Framework 4.5 ou version ultérieure contient de nombreux membres qui fonctionnent avec Async et Await.The .NET Framework 4.5 or higher contains many members that work with Async and Await. Vous pouvez identifier ces membres par le suffixe « Async » joint au nom de membre et un type de retour Task ou Task<TResult>.You can recognize these members by the "Async" suffix that’s attached to the member name and a return type of Task or Task<TResult>. Par exemple, la classe System.IO.Stream contient des méthodes telles que CopyToAsync, ReadAsync et WriteAsync en même temps que les méthodes synchrones CopyTo, Read et Write.For example, the System.IO.Stream class contains methods such as CopyToAsync, ReadAsync, and WriteAsync alongside the synchronous methods CopyTo, Read, and Write.

Windows Runtime contient également de nombreuses méthodes utilisables avec Async et Await dans les applications Windows.The Windows Runtime also contains many methods that you can use with Async and Await in Windows apps. Pour plus d’informations et des exemples de méthodes, consultez appeler les API asynchrones dans C# ou Visual Basic, programmation asynchrone (applications Windows Runtime), et WhenAny : Combler l’écart entre le .NET Framework et le Runtime Windows.For more information and example methods, see Call asynchronous APIs in C# or Visual Basic, Asynchronous programming (Windows Runtime apps), and WhenAny: Bridging between the .NET Framework and the Windows Runtime.

ThreadsThreads

Les méthodes Async sont conçues pour être des opérations non bloquantes.Async methods are intended to be non-blocking operations. Une expression Await dans une méthode async ne bloque pas le thread actuel lors de l’exécution de la tâche attendue.An Await expression in an async method doesn’t block the current thread while the awaited task is running. Au lieu de cela, l'expression inscrit le reste de la méthode comme continuation et retourne le contrôle à l'appelant de la méthode async.Instead, the expression signs up the rest of the method as a continuation and returns control to the caller of the async method.

Les mots clés Async et Await n’entraînent pas la création de threads supplémentaires.The Async and Await keywords don't cause additional threads to be created. Les méthodes Async ne requièrent pas de multithreading, car une méthode async ne fonctionne pas sur son propre thread.Async methods don't require multithreading because an async method doesn't run on its own thread. La méthode s'exécute sur le contexte de synchronisation actuel et utilise du temps sur le thread uniquement lorsqu'elle est active.The method runs on the current synchronization context and uses time on the thread only when the method is active. Vous pouvez utiliser Task.Run pour déplacer le travail lié au processeur vers un thread d'arrière-plan, mais un thread d'arrière-plan ne permet pas à un processus qui attend simplement les résultats de devenir disponible.You can use Task.Run to move CPU-bound work to a background thread, but a background thread doesn't help with a process that's just waiting for results to become available.

L’approche basée sur async en matière de programmation asynchrone est préférable aux approches existantes, dans presque tous les cas.The async-based approach to asynchronous programming is preferable to existing approaches in almost every case. En particulier, cette approche est préférable à BackgroundWorker pour les opérations d’e/S, car le code est plus simple et vous n’êtes pas obligé de se prémunir contre des conditions de concurrence.In particular, this approach is better than BackgroundWorker for I/O-bound operations because the code is simpler and you don't have to guard against race conditions. Combinée à Task.Run, la programmation asynchrone est meilleure que BackgroundWorker pour les opérations utilisant le processeur de manière intensive car la programmation asynchrone sépare les détails de coordination de l'exécution de votre code à partir du travail que Task.Run transfère au pool de threads.In combination with Task.Run, async programming is better than BackgroundWorker for CPU-bound operations because async programming separates the coordination details of running your code from the work that Task.Run transfers to the threadpool.

Async et AwaitAsync and Await

Si vous spécifiez qu’une méthode est une méthode async en utilisant un modificateur Async, vous activez les deux fonctionnalités suivantes.If you specify that a method is an async method by using an Async modifier, you enable the following two capabilities.

  • La méthode async marquée peut utiliser Await pour indiquer des points d’interruption.The marked async method can use Await to designate suspension points. L'opérateur await indique au compilateur que la méthode async ne peut pas continuer au-delà de ce point, tant que le processus asynchrone attendu n'est pas terminé.The await operator tells the compiler that the async method can't continue past that point until the awaited asynchronous process is complete. Entre-temps, le contrôle retourne à l'appelant de la méthode async.In the meantime, control returns to the caller of the async method.

    L’interruption d’une méthode async dans une expression Await ne constitue pas une sortie de la méthode et les blocs Finally ne s’exécutent pas.The suspension of an async method at an Await expression doesn't constitute an exit from the method, and Finally blocks don’t run.

  • La méthode async marquée peut elle-même être attendue par les méthodes qui l'appellent.The marked async method can itself be awaited by methods that call it.

La méthode async contient généralement une ou plusieurs occurrences d’un opérateur Await, mais l’absence des expressions Await ne provoque pas d’erreur du compilateur.An async method typically contains one or more occurrences of an Await operator, but the absence of Await expressions doesn’t cause a compiler error. Si une méthode async n’utilise pas un opérateur Await pour marquer un point de sélection, elle s’exécute comme le fait une méthode synchrone, en dépit du modificateur Async.If an async method doesn’t use an Await operator to mark a suspension point, the method executes as a synchronous method does, despite the Async modifier. Le compilateur émet un avertissement pour ces méthodes.The compiler issues a warning for such methods.

Async et Await sont des mots clés contextuels.Async and Await are contextual keywords. Pour plus d'informations et des exemples, consultez les rubriques suivantes :For more information and examples, see the following topics:

Paramètres et types de retourReturn Types and Parameters

Dans la programmation .NET Framework, une méthode async retourne généralement un Task ou Task<TResult>.In .NET Framework programming, an async method typically returns a Task or a Task<TResult>. Dans une méthode async, un opérateur Await est appliqué à une tâche retournée à partir d’un appel à une autre méthode async.Inside an async method, an Await operator is applied to a task that's returned from a call to another async method.

Vous spécifiez Task<TResult> comme type de retour si la méthode contient une instruction Return qui spécifie un opérande de type TResult.You specify Task<TResult> as the return type if the method contains a Return statement that specifies an operand of type TResult.

Vous utilisez Task comme type de retour si la méthode n'a aucune instruction return ou une instruction return qui ne retourne pas d'opérande.You use Task as the return type if the method has no return statement or has a return statement that doesn't return an operand.

L'exemple suivant montre comment déclarer et appeler une méthode qui retourne Task<TResult> ou Task.The following example shows how you declare and call a method that returns a Task<TResult> or a Task.

' Signature specifies Task(Of Integer)
Async Function TaskOfTResult_MethodAsync() As Task(Of Integer)

    Dim hours As Integer
    ' . . .
    ' Return statement specifies an integer result.
    Return hours
End Function

' Calls to TaskOfTResult_MethodAsync
Dim returnedTaskTResult As Task(Of Integer) = TaskOfTResult_MethodAsync()
Dim intResult As Integer = Await returnedTaskTResult
' or, in a single statement
Dim intResult As Integer = Await TaskOfTResult_MethodAsync()

' Signature specifies Task
Async Function Task_MethodAsync() As Task

    ' . . .
    ' The method has no return statement.
End Function

' Calls to Task_MethodAsync
Task returnedTask = Task_MethodAsync()
Await returnedTask
' or, in a single statement
Await Task_MethodAsync()

Chaque tâche retournée représente le travail en cours.Each returned task represents ongoing work. Une tâche encapsule des informations sur l’état du processus asynchrone et, éventuellement, le résultat final du processus ou l’exception que le processus déclenche s’il ne réussit pas.A task encapsulates information about the state of the asynchronous process and, eventually, either the final result from the process or the exception that the process raises if it doesn't succeed.

Une méthode async peut également être une méthode Sub.An async method can also be a Sub method. Ce type de retour est essentiellement utilisé pour définir les gestionnaires d’événements, où un type de retour est obligatoire.This return type is used primarily to define event handlers, where a return type is required. Les gestionnaires d'événements asynchrones servent souvent de point de départ aux programmes asynchrones.Async event handlers often serve as the starting point for async programs.

Une méthode async qui est une procédure Sub ne peut pas être attendue, et l’appelant ne peut capturer aucune exception levée par la méthode.An async method that’s a Sub procedure can’t be awaited, and the caller can't catch any exceptions that the method throws.

Une méthode async ne peut pas déclarer de paramètres ByRef, mais elle peut appeler des méthodes qui comportent ces paramètres.An async method can't declare ByRef parameters, but the method can call methods that have such parameters.

Pour plus d’informations ainsi que des exemples, consultez la page Types de retour Async (Visual Basic).For more information and examples, see Async Return Types (Visual Basic). Pour plus d’informations sur l’interception des exceptions dans les méthodes async, consultez la page Instruction Try...Catch...Finally.For more information about how to catch exceptions in async methods, see Try...Catch...Finally Statement.

Les API asynchrones dans la programmation Windows Runtime ont l’un des types de retour suivants, qui sont semblables aux tâches :Asynchronous APIs in Windows Runtime programming have one of the following return types, which are similar to tasks:

Pour plus d’informations et un exemple, consultez appeler les API asynchrones en c# ou Visual Basic.For more information and an example, see Call asynchronous APIs in C# or Visual Basic.

Convention d’affectation de nomsNaming Convention

Par convention, on ajoute « Async » aux noms des méthodes qui possèdent un modificateur Async.By convention, you append "Async" to the names of methods that have an Async modifier.

Vous pouvez ignorer la convention où un événement, une classe de base, ou un contrat d'interface suggère un nom différent.You can ignore the convention where an event, base class, or interface contract suggests a different name. Par exemple, vous ne devez pas renommer les gestionnaires d'événements communs, tels que Button1_Click.For example, you shouldn’t rename common event handlers, such as Button1_Click.

Rubriques connexes et exemples (Visual Studio)Related Topics and Samples (Visual Studio)

TitreTitle DescriptionDescription ExempleSample
Procédure pas à pas : Accès Web à l’aide d’Async et Await (Visual Basic)Walkthrough: Accessing the Web by Using Async and Await (Visual Basic) Montre comment convertir une solution WPF synchrone en une solution WPF asynchrone.Shows how to convert a synchronous WPF solution to an asynchronous WPF solution. L’application télécharge une série de sites web.The application downloads a series of websites. Exemple Async : Accès à la procédure webAsync Sample: Accessing the Web Walkthrough
Guide pratique pour Étendre la procédure pas à pas Async à l’aide de Task.WhenAll (Visual Basic)How to: Extend the Async Walkthrough by Using Task.WhenAll (Visual Basic) Ajoute Task.WhenAll à la procédure précédente.Adds Task.WhenAll to the previous walkthrough. L'utilisation de WhenAll démarre tous les téléchargements en même temps.The use of WhenAll starts all the downloads at the same time.
Guide pratique pour 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) Explique comment démarrer plusieurs tâches en même temps.Demonstrates how to start several tasks at the same time. Exemple Async : Effectuer plusieurs requêtes web en parallèleAsync Sample: Make Multiple Web Requests in Parallel
Types de retour Async (Visual Basic)Async Return Types (Visual Basic) Décrit les types que les méthodes async peuvent retourner et explique quand chaque type est approprié.Illustrates the types that async methods can return and explains when each type is appropriate.
Flux de contrôle dans les programmes Async (Visual Basic)Control Flow in Async Programs (Visual Basic) Effectue le suivi en détail du flux de contrôle via une série d'expressions await dans un programme asynchrone.Traces in detail the flow of control through a succession of await expressions in an asynchronous program. Exemple Async : Flux de contrôle dans les programmes AsyncAsync Sample: Control Flow in Async Programs
Ajuster une application Async (Visual Basic)Fine-Tuning Your Async Application (Visual Basic) Indique comment ajouter les fonctionnalités suivantes à votre solution async :Shows how to add the following functionality to your async solution:

- Annuler une tâche Asynch ou une liste de tâches (Visual Basic)- Cancel an Async Task or a List of Tasks (Visual Basic)
- Annuler des tâches Asynch après une période spécifique (Visual Basic)- Cancel Async Tasks after a Period of Time (Visual Basic)
- Annuler les tâches Asynch restantes lorsque l’une d’elles est terminée (Visual Basic)- Cancel Remaining Async Tasks after One Is Complete (Visual Basic)
- Démarrer plusieurs tâches Asynch et les traiter une fois terminées (Visual Basic)- Start Multiple Async Tasks and Process Them As They Complete (Visual Basic)
Exemple Async : Réglage de votre applicationAsync Sample: Fine Tuning Your Application
Gérer la réentrance dans Async Apps (Visual Basic)Handling Reentrancy in Async Apps (Visual Basic) Montre comment traiter les cas où une opération asynchrone active redémarre pendant son exécution.Shows how to handle cases in which an active asynchronous operation is restarted while it’s running.
WhenAny : transition entre .NET Framework et Windows RuntimeWhenAny: Bridging between the .NET Framework and the Windows Runtime Montre comment établir un pont entre les types de tâches dans le .NET Framework et IAsyncOperations dans le Runtime Windows afin que vous puissiez utiliser WhenAny avec une méthode Windows Runtime.Shows how to bridge between Task types in the .NET Framework and IAsyncOperations in the Windows Runtime so that you can use WhenAny with a Windows Runtime method. Exemple Async : transition entre .NET et Windows Runtime (AsTask et WhenAny)Async Sample: Bridging between .NET and Windows Runtime (AsTask and WhenAny)
Annulation Async : transition entre .NET Framework et Windows RuntimeAsync Cancellation: Bridging between the .NET Framework and the Windows Runtime Montre comment établir un pont entre les types de tâches dans le .NET Framework et IAsyncOperations dans le Runtime Windows afin que vous puissiez utiliser CancellationTokenSource avec une méthode Windows Runtime.Shows how to bridge between Task types in the .NET Framework and IAsyncOperations in the Windows Runtime so that you can use CancellationTokenSource with a Windows Runtime method. Exemple Async : transition entre .NET et Windows Runtime (AsTask & Annulation)Async Sample: Bridging between .NET and Windows Runtime (AsTask & Cancellation)
Utiliser async pour l’accès aux fichiers (Visual Basic)Using Async for File Access (Visual Basic) Répertorie et explique les avantages de l'utilisation d'async et d'await pour accéder aux fichiers.Lists and demonstrates the benefits of using async and await to access files.
Modèle asynchrone basé sur les tâches (TAP, Task-based Asynchronous Pattern)Task-based Asynchronous Pattern (TAP) Décrit un nouveau modèle pour le comportement asynchrone dans le .NET Framework.Describes a new pattern for asynchrony in the .NET Framework. Le modèle est basé sur les types Task et Task<TResult>.The pattern is based on the Task and Task<TResult> types.
Vidéos Async sur Channel 9Async Videos on Channel 9 Fournit des liens vers diverses vidéos sur la programmation asynchrone.Provides links to a variety of videos about async programming.

Exemple completComplete Example

Le code suivant est le fichier MainWindow.xaml.vb de l’application WPF (Windows Presentation Foundation) traitée dans cette rubrique.The following code is the MainWindow.xaml.vb file from the Windows Presentation Foundation (WPF) application that this topic discusses. Vous pouvez télécharger l’exemple à partir de Exemple Async : exemple de « Programmation asynchrone avec Async et Await ».You can download the sample from Async Sample: Example from "Asynchronous Programming with Async and Await".

' Add an Imports statement and a reference for System.Net.Http
Imports System.Net.Http

Class MainWindow

    ' Mark the event handler with async so you can use Await in it.
    Private Async Sub StartButton_Click(sender As Object, e As RoutedEventArgs)

        ' Call and await separately.
        'Task<int> getLengthTask = AccessTheWebAsync();
        '' You can do independent work here.
        'int contentLength = await getLengthTask;

        Dim contentLength As Integer = Await AccessTheWebAsync()

        ResultsTextBox.Text &=
            String.Format(vbCrLf & "Length of the downloaded string: {0}." & vbCrLf, contentLength)
    End Sub

    ' Three things to note in the signature:
    '  - The method has an Async modifier.
    '  - The return type is Task or Task(Of T). (See "Return Types" section.)
    '    Here, it is Task(Of Integer) because the return statement returns an integer.
    '  - The method name ends in "Async."
    Async Function AccessTheWebAsync() As Task(Of Integer)

        ' You need to add a reference to System.Net.Http to declare client.
        Dim client As HttpClient = New HttpClient()

        ' GetStringAsync returns a Task(Of String). That means that when you await the
        ' task you'll get a string (urlContents).
        Dim getStringTask As Task(Of String) = client.GetStringAsync("https://msdn.microsoft.com")

        ' You can do work here that doesn't rely on the string from GetStringAsync.
        DoIndependentWork()

        ' The Await operator suspends AccessTheWebAsync.
        '  - AccessTheWebAsync can't continue until getStringTask is complete.
        '  - Meanwhile, control returns to the caller of AccessTheWebAsync.
        '  - Control resumes here when getStringTask is complete.
        '  - The Await operator then retrieves the string result from getStringTask.
        Dim urlContents As String = Await getStringTask

        ' The return statement specifies an integer result.
        ' Any methods that are awaiting AccessTheWebAsync retrieve the length value.
        Return urlContents.Length
    End Function

    Sub DoIndependentWork()
        ResultsTextBox.Text &= "Working . . . . . . ." & vbCrLf
    End Sub
End Class

' Sample Output:

' Working . . . . . . .

' Length of the downloaded string: 41763.

Voir aussiSee also