Поделиться через


Оператор Await (Visual Basic)

Примените оператор Await к операнду в асинхронных метода или лямбда-выражения для приостановки выполнения метода до тех пор, пока ожидается задача не будет завершено.Задача представляет собой выполняющихся работы.

Метод Await, в котором используется должен иметь модификатор Async.Такой метод, указанный с помощью модификатора Async и обычно содержать один или несколько выражений Await, называется Метод async.

ПримечаниеПримечание

Ключевые слова Async и Await были введены в Visual Studio 2012.Дополнительные сведения о новых функциях в этой версии см. в разделе Новые возможности Visual Studio 2012, версия-кандидат.

Введение в токен программировании см. в разделе Асинхронное программирование с использованием ключевых слов Async и Await (C# и Visual Basic).

Как правило, задача, на которую применяется оператор Await возвращаемое значение из вызова метода, реализующего Асинхронная модель на основе задач, т е Task или Task<TResult>.

В следующем коде 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<TResult>.Свойства возвращаемой задачи содержат сведения об ее состоянии и журнал, например ли задача завершена, приводит ли метод токена исключение или был отменен, и что конечный результат.Оператор Await можно получить эти свойства.

Если предполагается, что задачи и возвратя метода, токена, который вызывает исключение, повторно создает исключение оператора Await.

Если предполагается, что задачи и возвратя метода, токена, отменяется, повторно создает оператора AwaitOperationCanceledException.

Одна задача, в состоянии, ошибли может являться несколько исключений.Например, задача может быть результатом вызова Task.WhenAll.После получения такой задачи, повторно создает только один операции ожидать исключений.Однако нельзя предугадать, какой из исключений, повторно создаются.

Примеры обработки ошибок в методах токенов см. в разделе Оператор 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)

Ссылки

Async (Visual Basic)

Основные понятия

Асинхронное программирование с использованием ключевых слов Async и Await (C# и Visual Basic)