Оператор Await (Visual Basic)
Примените оператор Await к операнду в асинхронных метода или лямбда-выражения для приостановки выполнения метода до тех пор, пока ожидается задача не будет завершено. Задача представляет выполняющуюся работу.
Метод Await, в котором используется должен иметь модификатор Async. Такой метод, определенный с помощью модификатора Async и обычно содержащий одно или несколько выражений Await, называется асинхронным методом или методом async.
Примечание
Ключевые слова Async и Await были введены в Visual Studio 2012.Введение в асинхронное программирование см. в разделе Асинхронное программирование с использованием ключевых слов Async и Await (C# и Visual Basic).
Как правило, задача, на которую применяется оператор Await возвращаемое значение из вызова метода, реализующего Асинхронная модель на основе задач, т е Task или Task.
В следующем коде GetByteArrayAsync, метод HttpClient возвращает значение getContentsTask, Task(Of Byte()). Для объявления является " обещанием " создать фактический массив байтов при завершении операции. Оператор Await применяется к getContentsTask, чтобы приостановить выполнение в SumPageSizesAsync до тех пор, пока getContentsTask не будет завершен. Тем временем, управление возвращается к вызывающему объекту SumPageSizesAsync. После завершения метода getContentsTask, выражение Await оценивается как массив байтов.
Private Async Function SumPageSizesAsync() As Task
' To use the HttpClient type in desktop apps, you must include a using directive and add a
' reference for the System.Net.Http namespace.
Dim client As HttpClient = New HttpClient()
' . . .
Dim getContentsTask As Task(Of Byte()) = client.GetByteArrayAsync(url)
Dim urlContents As Byte() = Await getContentsTask
' Equivalently, now that you see how it works, you can write the same thing in a single line.
'Dim urlContents As Byte() = Await client.GetByteArrayAsync(url)
' . . .
End Function
Важно!
Полный пример см. в разделе Пошаговое руководство. Получение доступа к Интернету с помощью модификатора Async и оператора Await (C# и Visual Basic).Можно загрузить пример со страницы Примеры кода разработчика на веб-сайте Майкрософт.Пример находится в проекте AsyncWalkthrough_HttpClient.
Если атрибут Await применяется к результату вызова метода, который возвращает Task(Of TResult) тип выражения Await TResult. Если атрибут Await применяется к результату вызова метода, который возвращает Task, выражение Await не возвращает значение. В следующем примере показана разница.
' Await used with a method that returns a Task(Of TResult).
Dim result As TResult = Await AsyncMethodThatReturnsTaskTResult()
' Await used with a method that returns a Task.
Await AsyncMethodThatReturnsTask()
Выражение или выписка Await не будет блокировать поток, в котором она выполняется. Вместо этого она указывает компилятору зарегистрироваться остальную часть метода токена, после выражения Await как продолжение, предназначенную для задачи. Управление затем возвращается вызывающему объекту асинхронного метода. Если задача завершается, она вызывает его продолжение, а выполнение метода токена продолжится, где было остановлено.
Выражение Await может произойти только в теле немедленно внешнего метода или лямбда-выражения, которое помечено модификатором Async. Термин ожидает служит ключевое слово только в этом контексте. В другом месте, оно интерпретируется как идентификатор. В методе или лямбда-выражения токена, выражение Await не может содержаться в выражении запроса, в блоке catch или finally выписки Try… Catch… finally, в выражении элемента управления цикла переменной цикла For или For Each, или в теле выписки SyncLock.
Исключения
Большинство асинхронных методов возвращают значение Task или Task. Свойства возвращаемой задачи содержат сведения о ее состоянии и истории, такие как завершена ли задача, привел ли асинхронный метод к исключению или был отменен, а также каков конечный результат. Оператор Await получает доступ к этим свойствам.
Если выполняется await для возвращающего метода async, который вызывает исключение, оператор Await повторно создает исключение.
Если предполагается, что задачи и возвратя метода, токена, отменяется, повторно создает оператора AwaitOperationCanceledException.
Одна задача в состоянии ошибки может отражать несколько исключений. Например, задача может быть результатом вызова Task.WhenAll. Когда ожидаете такой задачи, операция await повторно создает только одно из исключений. Однако невозможно предугадать, какое из исключений повторно создается.
Примеры обработки ошибок в асинхронных методах см. Оператор Try... Catch... Finally (Visual Basic).
Пример
В следующем примере Windows Forms показано использование токена Await в асинхронном методе WaitAsynchronouslyAsync. Сравните поведение этого метода с поведением WaitSynchronously. Без оператора Await, даже если WaitSynchronously выполняется одновременно использовать модификатор Async в определении и вызове Thread.Sleep в своем теле.
Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
' Call the method that runs asynchronously.
Dim result As String = Await WaitAsynchronouslyAsync()
' Call the method that runs synchronously.
'Dim result As String = Await WaitSynchronously()
' Display the result.
TextBox1.Text &= result
End Sub
' The following method runs asynchronously. The UI thread is not
' blocked during the delay. You can move or resize the Form1 window
' while Task.Delay is running.
Public Async Function WaitAsynchronouslyAsync() As Task(Of String)
Await Task.Delay(10000)
Return "Finished"
End Function
' The following method runs synchronously, despite the use of Async.
' You cannot move or resize the Form1 window while Thread.Sleep
' is running because the UI thread is blocked.
Public Async Function WaitSynchronously() As Task(Of String)
' Import System.Threading for the Sleep method.
Thread.Sleep(10000)
Return "Finished"
End Function
См. также
Задачи
Ссылки
Основные понятия
Асинхронное программирование с использованием ключевых слов Async и Await (C# и Visual Basic)