Асинхронное программирование с использованием Async и await (Visual Basic)Asynchronous programming with Async and Await (Visual Basic)

Асинхронное программирование позволяет избежать появления узких мест производительности и увеличить общую скорость реагирования приложения.You can avoid performance bottlenecks and enhance the overall responsiveness of your application by using asynchronous programming. Однако традиционные методы создания асинхронных приложений могут оказаться сложными, как в плане написания кода, так и в плане отладки и обслуживания.However, traditional techniques for writing asynchronous applications can be complicated, making them difficult to write, debug, and maintain.

Visual Studio 2012 вводит упрощенный подход асинхронного программирования, который использует асинхронные возможности .NET Framework 4.5 (и более высоких версий) и среды выполнения Windows.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. Компилятор выполняет сложную работу, которую раньше делал разработчик, при этом логическая структура кода приложения похожа на синхронный код.The compiler does the difficult work that the developer used to do, and your application retains a logical structure that resembles synchronous code. То есть можно пользоваться всеми преимуществами асинхронного программирования с гораздо меньшими, чем обычно, трудозатратами.As a result, you get all the advantages of asynchronous programming with a fraction of the effort.

В этом разделе рассматриваются области и методы использования асинхронного программирования, а также приводятся ссылки на вспомогательные разделы с дополнительными сведениями и примерами.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 повышает скорость реагированияAsync improves responsiveness

Асинхронность необходимо использовать при наличии потенциально блокирующих действий — например, когда приложение подключается к Интернету.Asynchrony is essential for activities that are potentially blocking, such as when your application accesses the web. Доступ к веб-ресурсу иногда осуществляется медленно или с задержкой.Access to a web resource sometimes is slow or delayed. Если такое действие блокируется в пределах синхронного процесса, все приложение вынуждено ожидать.If such an activity is blocked within a synchronous process, the entire application must wait. В асинхронном процессе приложение может перейти к следующей операции, не зависящей от веб-ресурса, до завершения блокирующей задачи.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.

В следующей таблице показаны стандартные области, в которых асинхронное программирование повышает скорость реагирования.The following table shows typical areas where asynchronous programming improves responsiveness. Перечисленные интерфейсы API платформы .NET Framework 4.5 и среды выполнения Windows содержат методы, поддерживающие асинхронное программирование.The listed APIs from the .NET Framework 4.5 and the Windows Runtime contain methods that support async programming.

Область приложенияApplication area Поддерживающие интерфейсы API, которые содержат асинхронные методыSupporting APIs that contain async methods
Веб-доступWeb access HttpClient, SyndicationClientHttpClient, SyndicationClient
Работа с файламиWorking with files StorageFile, StreamWriter, StreamReader, XmlReaderStorageFile, StreamWriter, StreamReader, XmlReader
Работа с образамиWorking with images MediaCapture, BitmapEncoder, BitmapDecoderMediaCapture, BitmapEncoder, BitmapDecoder
Программирование с использованием WCFWCF programming Синхронные и асинхронные операцииSynchronous and Asynchronous Operations

Асинхронность особенно полезна в приложениях, которые обращаются к потоку пользовательского интерфейса, поскольку все связанные с пользовательским интерфейсом действия обычно используют один поток.Asynchrony proves especially valuable for applications that access the UI thread because all UI-related activity usually shares one thread. В синхронном приложении блокировка одного процесса приводит к блокировке всех процессов.If any process is blocked in a synchronous application, all are blocked. Приложение перестает отвечать, и это выглядит как сбой, а не как ожидание.Your application stops responding, and you might conclude that it has failed when instead it's just waiting.

При использовании асинхронных методов приложение продолжает реагировать на действия в пользовательском интерфейсе.When you use asynchronous methods, the application continues to respond to the UI. Например, можно изменить размер окна или свернуть его, либо закрыть приложение, если не требуется ждать завершения работы.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.

Асинхронный подход добавляет эквивалент автоматической передачи в список параметров, выбранных при создании асинхронных операций.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. То есть разработчик может пользоваться всеми преимуществами традиционного асинхронного программирования, прикладывая гораздо меньше усилий.That is, you get all the benefits of traditional asynchronous programming but with much less effort from the developer.

Методы Async проще создаватьAsync methods are easier to write

В Visual Basic основой асинхронного программирования являются ключевые слова Async и Await.The Async and Await keywords in Visual Basic are the heart of async programming. Они позволяют использовать ресурсы платформы .NET Framework или среды выполнения Windows для создания асинхронных методов, и это почти так же просто, как создавать синхронные методы.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. Методы, которые определяются с помощью ключевых слов Async и Await, называются асинхронными методами.Asynchronous methods that you define by using Async and Await are referred to as async methods.

Ниже приводится пример асинхронного метода.The following example shows an async method. Почти все элементы кода должны быть вам знакомы.Almost everything in the code should look completely familiar to you. Комментарии указывают на возможности, добавляемые для создания асинхронности.The comments call out the features that you add to create the asynchrony.

Полный файл примера Windows Presentation Foundation представлен в конце раздела. Также его можно скачать на странице примера асинхронной работы из руководства по использованию ключевых слов Async и 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 about writing an Async Function:
'  - The function has an Async modifier. 
'  - Its return type is Task or Task(Of T). (See "Return Types" section.)
'  - As a matter of convention, its name ends in "Async".
Async Function AccessTheWebAsync() As Task(Of Integer)
    Using client As New HttpClient()
        ' Call and await separately. 
        '  - AccessTheWebAsync can do other things while GetStringAsync is also running.
        '  - getStringTask stores the task we get from the call to GetStringAsync. 
        '  - Task(Of String) means it is a task which returns a String when it is done.
        Dim getStringTask As Task(Of String) =
            client.GetStringAsync("https://docs.microsoft.com/dotnet")
        ' You can do other work here that doesn't rely on the string from GetStringAsync.
        DoIndependentWork()
        ' The Await operator suspends AccessTheWebAsync.
        '  - AccessTheWebAsync does not 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.
        ' A method which awaits AccessTheWebAsync receives the Length value.
        Return urlContents.Length
        
    End Using
    
End Function

Если метод AccessTheWebAsync не выполняет никакие операции между вызовом метода GetStringAsync и его завершением, можно упростить код, описав вызов и ожидание с помощью следующего простого оператора.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()

Ниже перечислены характеристики, которые делают предыдущий пример асинхронным методом.The following characteristics summarize what makes the previous example an async method:

  • Сигнатура метода включает модификатор Async.The method signature includes an Async modifier.

  • Имя асинхронного метода, как правило, оканчивается суффиксом Async.The name of an async method, by convention, ends with an "Async" suffix.

  • Возвращаемое значение имеет один из следующих типов:The return type is one of the following types:

    • Task<TResult>, если метод имеет оператор Return с операндом типа TResult.Task<TResult> if your method has a return statement in which the operand has type TResult.
    • Task, если метод не имеет оператора Return или имеет оператор Return без операнда.Task if your method has no return statement or has a return statement with no operand.
    • Sub, если вы создаете асинхронный обработчик событий.Sub if you're writing an async event handler.

    Дополнительные сведения см. ниже в подразделе "типы возвращаемого значения и параметры".For more information, see "Return Types and Parameters" later in this topic.

  • Метод обычно содержит по крайней мере одно выражение await, отмечающее точку, в которой метод не может выполняться до завершения асинхронной операции.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. На это время метод приостанавливается и управление возвращается к вызывающему объекту метода.In the meantime, the method is suspended, and control returns to the method's caller. В следующем подразделе показано, что происходит в точке приостановки.The next section of this topic illustrates what happens at the suspension point.

В асинхронных методах с помощью соответствующих ключевых слов и типов указывается, что требуется сделать, а компилятор выполняет остальные задачи, в том числе отслеживает обязательные действия, когда управление возвращается в точку await в приостановленном методе.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. Некоторые программные процессы, такие как циклы и обработка исключений, сложно добавлять в традиционный асинхронный код.Some routine processes, such as loops and exception handling, can be difficult to handle in traditional asynchronous code. В асинхронном методе эти элементы пишутся почти так же, как в синхронном решении, что очень удобно.In an async method, you write these elements much as you would in a synchronous solution, and the problem is solved.

Дополнительные сведения об асинхронности в предыдущих версиях платформы .NET Framework, см. в статье TPL and Traditional .NET Framework Asynchronous Programming (Библиотека параллельных задач и традиционное асинхронное программирование в .NET Framework).For more information about asynchrony in previous versions of the .NET Framework, see TPL and Traditional .NET Framework Asynchronous Programming.

Что происходит в асинхронном методеWhat happens in an Async method

В асинхронном программировании важнее всего понимать, как поток управления перемещается из метода в метод.The most important thing to understand in asynchronous programming is how the control flow moves from method to method. Следующая схема описывает этот процесс.The following diagram leads you through the process:

Схема, показывающая трассировку асинхронной программы.

Числа в схеме соответствуют следующим шагам.The numbers in the diagram correspond to the following steps:

  1. Обработчик событий вызывает и ожидает асинхронный метод AccessTheWebAsync.An event handler calls and awaits the AccessTheWebAsync async method.

  2. AccessTheWebAsync создает экземпляр HttpClient и вызывает асинхронный метод GetStringAsync, чтобы загрузить содержимое веб-сайта в виде строки.AccessTheWebAsync creates an HttpClient instance and calls the GetStringAsync asynchronous method to download the contents of a website as a string.

  3. В GetStringAsync происходит событие, которое приостанавливает ход выполнения.Something happens in GetStringAsync that suspends its progress. Например, методу необходимо подождать завершения загрузки или произошло другое блокирующее действие.Perhaps it must wait for a website to download or some other blocking activity. Чтобы избежать блокировки ресурсов, GetStringAsync передает управление вызывающему объекту AccessTheWebAsync.To avoid blocking resources, GetStringAsync yields control to its caller, AccessTheWebAsync.

    GetStringAsync возвращает Task<TResult>, где TResult — строка, и AccessTheWebAsync присваивает задачу переменной getStringTask.GetStringAsync returns a Task<TResult> where TResult is a string, and AccessTheWebAsync assigns the task to the getStringTask variable. Задача представляет собой непрерывный процесс для вызова GetStringAsync с обязательством создать фактическое значение строки, когда работа будет завершена.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. Поскольку значение из процесса getStringTask еще не получено, метод AccessTheWebAsync может перейти к другим операциям, не зависящим от конечного результатаGetStringAsync.Because getStringTask hasn't been awaited yet, AccessTheWebAsync can continue with other work that doesn't depend on the final result from GetStringAsync. Эти операции представлены вызовом синхронного метода DoIndependentWork.That work is represented by a call to the synchronous method DoIndependentWork.

  5. DoIndependentWork — это синхронный метод, который выполняет свой код и возвращает управление вызывающему объекту.DoIndependentWork is a synchronous method that does its work and returns to its caller.

  6. Метод AccessTheWebAsync выполнил все операции, для которых не требуется результат процесса getStringTask.AccessTheWebAsync has run out of work that it can do without a result from getStringTask. Далее метод AccessTheWebAsync должен вычислить длину загруженной строки и возвратить ее, но не может этого сделать, пока нет строки.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.

    Поэтому AccessTheWebAsync использует оператор await, чтобы приостановить свою работу и передать управление методу, вызвавшему AccessTheWebAsync.Therefore, AccessTheWebAsync uses an await operator to suspend its progress and to yield control to the method that called AccessTheWebAsync. AccessTheWebAsync возвращает Task<int> (Task(Of Integer) в Visual Basic) для вызывающего объекта.AccessTheWebAsync returns a Task<int> (Task(Of Integer) in Visual Basic) to the caller. Задача представляет собой обещание создать целочисленный результат, являющийся длиной загруженной строки.The task represents a promise to produce an integer result that's the length of the downloaded string.

    Примечание

    Если метод GetStringAsync (и, следовательно, процесс getStringTask) выполнен прежде, чем этого дождется AccessTheWebAsync, управление остается у метода AccessTheWebAsync.If GetStringAsync (and therefore getStringTask) is complete before AccessTheWebAsync awaits it, control remains in AccessTheWebAsync. На приостановку метода AccessTheWebAsync и последующий возврат к нему были бы потрачены лишние ресурсы, если вызываемый асинхронный процесс (getStringTask) уже завершен и AccessTheWebSync не нужно ждать окончательного результата.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.

    Внутри вызывающего объекта (в данном примере — обработчика событий) шаблон обработки повторяется.Inside the caller (the event handler in this example), the processing pattern continues. Вызывающий объект может выполнять другие операции, не зависящие от результата AccessTheWebAsync, во время ожидания этого результата, или сразу ожидать результата.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. Обработчик событий ожидает AccessTheWebAsync, а AccessTheWebAsync ожидает GetStringAsync.The event handler is waiting for AccessTheWebAsync, and AccessTheWebAsync is waiting for GetStringAsync.

  7. GetStringAsync завершается и создает строковый результат.GetStringAsync completes and produces a string result. Вызов возвращает строковый результат в метод GetStringAsync, но не так, как, возможно, ожидалось.The string result isn't returned by the call to GetStringAsync in the way that you might expect. (Помните, что метод уже возвратил задачу в шаге 3.) Вместо этого строковый результат хранится в задаче 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. Оператор await извлекает результат из getStringTask.The await operator retrieves the result from getStringTask. Оператор присваивания назначает извлеченный результат urlContents.The assignment statement assigns the retrieved result to urlContents.

  8. Если AccessTheWebAsync содержит строковый результат, метод может вычислить длину строки.When AccessTheWebAsync has the string result, the method can calculate the length of the string. Затем работа AccessTheWebAsync также завершена, и ожидающий обработчик событий может возобновить работу.Then the work of AccessTheWebAsync is also complete, and the waiting event handler can resume. В полном примере в конце этого раздела видно, что обработчик событий извлекает значение длины и выводит результат.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.

Если вы недавно занимаетесь асинхронным программированием, рекомендуем обратить внимание на различия между синхронным и асинхронным поведением.If you are new to asynchronous programming, take a minute to consider the difference between synchronous and asynchronous behavior. Синхронный метод возвращает управление, когда его работа завершается (шаг 5), тогда как асинхронный метод возвращает значение задачи, когда его работа приостанавливается (шаги 3 и 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). Когда асинхронный метод в конечном счете завершает работу, задача помечается как завершенная и результат, при его наличии, сохраняется в задаче.When the async method eventually completes its work, the task is marked as completed and the result, if any, is stored in the task.

Дополнительные сведения о потоке управления см. в статье Control Flow in Async Programs (Visual Basic) (Поток управления в асинхронных программах на Visual Basic).For more information about control flow, see Control Flow in Async Programs (Visual Basic).

Методы Async APIAPI Async Methods

Где же найти методы для асинхронного программирования (такие как GetStringAsync)?You might be wondering where to find methods such as GetStringAsync that support async programming. .NET Framework 4,5 или более поздней версии содержит множество элементов, которые работают с Async и Await.The .NET Framework 4.5 or higher contains many members that work with Async and Await. Эти члены можно распознать с помощью суффикса Async, присоединенного к имени члена, и возвращаемого типа Task или 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>. Например, класс System.IO.Stream имеет такие методы, как CopyToAsync, ReadAsync и WriteAsync, наряду с синхронными методами CopyTo, Read и 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 также содержит множество методов, которые можно использовать в сочетании с Async и Await в приложениях Windows.The Windows Runtime also contains many methods that you can use with Async and Await in Windows apps. Дополнительные сведения и примеры методов см. в разделе Вызов асинхронных C# api в или Visual Basic, Асинхронное программирование (среда выполнения Windows приложений)и [WhenAny: Мост между .NET Framework и среда выполнения Windows @ no__t-0.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.

ПотокиThreads

Асинхронные методы используются для неблокирующих операций.Async methods are intended to be non-blocking operations. Выражение Await в асинхронном методе не блокирует текущий поток во время выполнения ожидаемой задачи.An Await expression in an async method doesn't block the current thread while the awaited task is running. Вместо этого выражение регистрирует остальную часть метода как продолжение и возвращает управление вызывающему объекту асинхронного метода.Instead, the expression signs up the rest of the method as a continuation and returns control to the caller of the async method.

Ключевые слова Async и Await не вызывают создания дополнительных потоков.The Async and Await keywords don't cause additional threads to be created. Асинхронные методы не нуждаются в многопоточности, поскольку асинхронный метод не выполняется в собственном потоке.Async methods don't require multi-threading because an async method doesn't run on its own thread. Метод выполняется в текущем контексте синхронизации и использует время в потоке, только когда метод активен.The method runs on the current synchronization context and uses time on the thread only when the method is active. Метод Task.Run можно применять для перемещения операций, использующих ресурсы ЦП, в фоновый поток, однако фоновый поток не имеет смысла применять для процесса, который просто ждет результата.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.

Асинхронный подход к асинхронному программированию практически по всем параметрам имеет преимущество перед другими подходами.The async-based approach to asynchronous programming is preferable to existing approaches in almost every case. В частности, этот подход лучше, чем BackgroundWorker для операций, связанных с вводом-выводом, так как код проще и не требуется защищаться от конкуренции.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. В сочетании с Task.Run асинхронное программирование лучше BackgroundWorker для операций, использующих ресурсы ЦП, поскольку отделяет сведения координации о выполнении кода от действий, которые Task.Run перемещает в пул потоков.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 и AwaitAsync and Await

Если с помощью модификатора Async указать, что метод является асинхронным, появятся следующие две возможности.If you specify that a method is an async method by using an Async modifier, you enable the following two capabilities.

  • Асинхронный метод сможет использовать Await для обозначения точек приостановки.The marked async method can use Await to designate suspension points. Оператор await сообщает компилятору, что асинхронный метод не может выполняться после этой точки до завершения ожидаемого асинхронного процесса.The await operator tells the compiler that the async method can't continue past that point until the awaited asynchronous process is complete. На это время управление возвращается вызывающему объекту асинхронного метода.In the meantime, control returns to the caller of the async method.

    Приостановка асинхронного метода в выражении Await не является выходом из метода, и блоки Finally не выполняются.The suspension of an async method at an Await expression doesn't constitute an exit from the method, and Finally blocks don't run.

  • Сам обозначенный асинхронный метод может ожидаться вызывающими его методами.The marked async method can itself be awaited by methods that call it.

Асинхронный метод обычно содержит одно или несколько вхождений оператора Await, но отсутствие Await выражения не вызывает ошибку компилятора.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. Если асинхронный метод не использует оператор Await для пометки точки приостановки, метод выполняется как синхронный метод, несмотря на модификатор 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. При компиляции таких методов выдается предупреждение.The compiler issues a warning for such methods.

Async и Await являются контекстными ключевыми словами.Async and Await are contextual keywords. Дополнительные сведения и примеры см. в следующих разделах:For more information and examples, see the following topics:

Типы и параметры возвращаемого значенияReturn types and parameters

В программировании на платформе .NET Framework асинхронный метод обычно возвращает Task или Task<TResult>.In .NET Framework programming, an async method typically returns a Task or a Task<TResult>. Внутри асинхронного метода оператор Await применяется к задаче, возвращаемой из вызова другого асинхронного метода.Inside an async method, an Await operator is applied to a task that's returned from a call to another async method.

В качестве возвращаемого типа указывается Task<TResult>, если метод содержит оператор Return, который задает операнд типа TResult.You specify Task<TResult> as the return type if the method contains a Return statement that specifies an operand of type TResult.

В качестве возвращаемого типа используется Task, если метод не содержит операторов return или содержит оператор return, который не возвращает операнд.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.

В следующем примере показано, как объявить и вызвать метод, возвращающий Task<TResult> или 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()

Каждая возвращенная задача представляет выполняющуюся работу.Each returned task represents ongoing work. Задача инкапсулирует информацию о состоянии асинхронного процесса и, в итоге, либо конечный результат процесса, либо исключение, созданное процессом в случае его сбоя.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.

Асинхронный метод может также быть методом Sub.An async method can also be a Sub method. Тип возвращаемого значения в основном используется для определения обработчиков событий, где требуется возвращать тип.This return type is used primarily to define event handlers, where a return type is required. Асинхронные обработчики событий часто служат в качестве отправной точки для асинхронных программ.Async event handlers often serve as the starting point for async programs.

Асинхронный метод, который является процедурой Sub, не может быть ожидающим, и вызывающий объект не может перехватить все исключения, которые вызывает метод.An async method that's a Sub procedure can't be awaited, and the caller can't catch any exceptions that the method throws.

Асинхронный метод не может объявлять параметры ByRef, но может вызывать методы, которые имеют такие параметры.An async method can't declare ByRef parameters, but the method can call methods that have such parameters.

Дополнительные сведения и примеры см. в статье о типах возвращаемых значений асинхронных операций.For more information and examples, see Async Return Types (Visual Basic). Дополнительные сведения о перехвате исключений в асинхронных методах см. в статье об операторе Try...Catch...Finally.For more information about how to catch exceptions in async methods, see Try...Catch...Finally Statement.

При программировании в среде выполнения Windows асинхронные API-интерфейсы имеют один из следующих возвращаемых типов, которые похожи на задачи.Asynchronous APIs in Windows Runtime programming have one of the following return types, which are similar to tasks:

Дополнительные сведения и пример см. в разделе Вызов асинхронных API C# в или Visual Basic.For more information and an example, see Call asynchronous APIs in C# or Visual Basic.

Соглашение об именованииNaming convention

По соглашению к именам методов, которые имеют модификатор Async, добавляется суффикс Async.By convention, you append "Async" to the names of methods that have an Async modifier.

Соглашение можно игнорировать в тех случаях, когда событие, базовый класс или контракт интерфейса предлагает другое имя.You can ignore the convention where an event, base class, or interface contract suggests a different name. Например, не следует переименовывать общие обработчики событий, например Button1_Click.For example, you shouldn't rename common event handlers, such as Button1_Click.

Связанные разделы и примеры (Visual Studio)Related topics and samples (Visual Studio)

ЗаголовокTitle ОписаниеDescription ПримерSample
Пошаговое руководство: Доступ к Интернету с помощью Async и await (Visual Basic) Walkthrough: Accessing the Web by Using Async and Await (Visual Basic) Иллюстрирует преобразование синхронного решения WPF в асинхронное.Shows how to convert a synchronous WPF solution to an asynchronous WPF solution. Приложение загружает ряд веб-сайтов.The application downloads a series of websites. Пример использования Async. Пошаговое руководство по обращению к веб-сайтамAsync Sample: Accessing the Web Walkthrough
Практическое руководство. Расширение асинхронного пошагового руководства с помощью Task. WhenAll (Visual Basic) How to: Extend the Async Walkthrough by Using Task.WhenAll (Visual Basic) Добавляет Task.WhenAll к предыдущему пошаговому руководству.Adds Task.WhenAll to the previous walkthrough. Использование WhenAll запускает все загрузки одновременно.The use of WhenAll starts all the downloads at the same time.
Практическое руководство. Параллельное создание нескольких веб-запросов с помощью Async и await (Visual Basic) How to: Make Multiple Web Requests in Parallel by Using Async and Await (Visual Basic) Иллюстрирует, как запустить несколько задач одновременно.Demonstrates how to start several tasks at the same time. Пример использования Async. Параллельное выполнение нескольких веб-запросовAsync Sample: Make Multiple Web Requests in Parallel
Async Return Types (Visual Basic) (Типы возвращаемых значений Async (Visual Basic))Async Return Types (Visual Basic) Иллюстрирует типы, которые могут возвращать асинхронные методы, и поясняет, когда следует использовать каждый из этих типов.Illustrates the types that async methods can return and explains when each type is appropriate.
Control Flow in Async Programs (Visual Basic) (Поток управления в асинхронных программах (Visual Basic))Control Flow in Async Programs (Visual Basic) Выполняет подробную трассировку потока управления через последовательность выражений ожидания в асинхронной программе.Traces in detail the flow of control through a succession of await expressions in an asynchronous program. Пример использования Async. Поток управления в асинхронных программахAsync Sample: Control Flow in Async Programs
Fine-Tuning Your Async Application (Visual Basic) (Настройка асинхронного приложения (Visual Basic))Fine-Tuning Your Async Application (Visual Basic) Иллюстрирует добавление следующих функциональных возможностей в асинхронное решение:Shows how to add the following functionality to your async solution:

- Cancel an Async Task or a List of Tasks (Visual Basic) (Отмена асинхронной задачи или списка задач в Visual Basic)- Cancel an Async Task or a List of Tasks (Visual Basic)
- Cancel Async Tasks after a Period of Time (Visual Basic) (Отмена асинхронных задач после определенного периода времени в Visual Basic)- Cancel Async Tasks after a Period of Time (Visual Basic)
- Cancel Remaining Async Tasks after One Is Complete (Visual Basic) (Отмена оставшихся асинхронных задач после завершения одной из них в Visual Basic)- Cancel Remaining Async Tasks after One Is Complete (Visual Basic)
- Start Multiple Async Tasks and Process Them As They Complete (Visual Basic) (Запуск нескольких асинхронных задач и их обработка по мере завершения в Visual Basic)- Start Multiple Async Tasks and Process Them As They Complete (Visual Basic)
Пример использования Async. Настройка приложенияAsync Sample: Fine Tuning Your Application
Handling Reentrancy in Async Apps (Visual Basic) (Обработка повторного входа в асинхронных приложениях Visual Basic)Handling Reentrancy in Async Apps (Visual Basic) Показывает, как справляться с ситуациями, в которых активная асинхронная операция перезапускается во время ее выполнения.Shows how to handle cases in which an active asynchronous operation is restarted while it's running.
WhenAny. Связывание .NET Framework и среды выполнения Windows в C# и Visual BasicWhenAny: Bridging between the .NET Framework and the Windows Runtime Иллюстрирует, как создать мост между типами задач на платформе .NET Framework и IAsyncOperations в среде выполнения Windows, чтобы можно было использовать WhenAny с методом среды выполнения Windows.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. Пример использования Async. Связывание .NET и среды выполнения Windows с помощью AsTask и WhenAnyAsync Sample: Bridging between .NET and Windows Runtime (AsTask and WhenAny)
Отмена Async. Связывание .NET Framework и среды выполнения WindowsAsync Cancellation: Bridging between the .NET Framework and the Windows Runtime Иллюстрирует, как создать мост между типами задач на платформе .NET Framework и IAsyncOperations в среде выполнения Windows, чтобы можно было использовать CancellationTokenSource с методом среды выполнения Windows.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. Пример использования Async. Связывание .NET и среды выполнения Windows с помощью AsTask и CancellationAsync Sample: Bridging between .NET and Windows Runtime (AsTask & Cancellation)
Using Async for File Access (Visual Basic) (Использование метода Async для доступа к файлам (Visual Basic))Using Async for File Access (Visual Basic) Иллюстрирует преимущества использования асинхронности и ожидания для доступа к файлам.Lists and demonstrates the benefits of using async and await to access files.
Task-based Asynchronous Pattern (TAP) (Асинхронный шаблон, основанный на задачах (TAP))Task-based Asynchronous Pattern (TAP) Описывает новый шаблон для асинхронности в платформе .NET Framework.Describes a new pattern for asynchrony in the .NET Framework. Шаблон основан на типах Task и Task<TResult>.The pattern is based on the Task and Task<TResult> types.
Видеоролики об async на канале Channel 9Async Videos on Channel 9 Предоставляет ссылки на различные видеоролики об асинхронном программировании.Provides links to a variety of videos about async programming.

Полный примерComplete Example

Ниже представлен код файла MainWindow.xaml.vb из приложения Windows Presentation Foundation (WPF), которое обсуждается в этой статье.The following code is the MainWindow.xaml.vb file from the Windows Presentation Foundation (WPF) application that this topic discusses. Вы можете скачать пример использования Async из руководства по использованию ключевых слов Async и Await.You can download the sample from Async Sample: Example from "Asynchronous Programming with Async and Await".


Imports System.Net.Http

' Example that demonstrates Asynchronous Progamming with Async and Await.
' It uses HttpClient.GetStringAsync to download the contents of a website.
' Sample Output:
' Working . . . . . . .
'
' Length of the downloaded string: 39678.

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 immediately.
        ' StartButton_Click suspends until AccessTheWebAsync is done.
        Dim contentLength As Integer = Await AccessTheWebAsync()

        ResultsTextBox.Text &= $"{vbCrLf}Length of the downloaded string: {contentLength}.{vbCrLf}"

    End Sub


    ' Three things to note about writing an Async Function:
    '  - The function has an Async modifier. 
    '  - Its return type is Task or Task(Of T). (See "Return Types" section.)
    '  - As a matter of convention, its name ends in "Async".
    Async Function AccessTheWebAsync() As Task(Of Integer)

        Using client As New HttpClient()

            ' Call and await separately. 
            '  - AccessTheWebAsync can do other things while GetStringAsync is also running.
            '  - getStringTask stores the task we get from the call to GetStringAsync. 
            '  - Task(Of String) means it is a task which returns a String when it is done.
            Dim getStringTask As Task(Of String) =
                client.GetStringAsync("https://docs.microsoft.com/dotnet")

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

            ' The Await operator suspends AccessTheWebAsync.
            '  - AccessTheWebAsync does not 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.
            ' A method which awaits AccessTheWebAsync receives the Length value.
            Return urlContents.Length

        End Using

    End Function

    Sub DoIndependentWork()
        ResultsTextBox.Text &= $"Working . . . . . . .{vbCrLf}"
    End Sub

End Class

См. такжеSee also