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


Async (Visual Basic)

Модификатор Async указывает, что метод или лямбда-выражение , которое он изменяет, является асинхронным. Такие методы называются асинхронными методами.

Асинхронный метод представляет собой удобный способ для выполнения работы, которая может занять длительное время, без блокировки потока вызывающего объекта. Вызывающий метод асинхронного метода может возобновить работу, не ожидая завершения асинхронного метода.

Примечание.

Ключевые слова Async и Await появились в Visual Studio 2012. Общие сведения о асинхронном программировании см. в статье "Асинхронное программирование" и "Ожидание".

В следующем примере показана структура асинхронного метода. По соглашению имена асинхронных методов заканчиваются в "Async".

Public Async Function ExampleMethodAsync() As Task(Of Integer)
    ' . . .

    ' At the Await expression, execution in this method is suspended and,
    ' if AwaitedProcessAsync has not already finished, control returns
    ' to the caller of ExampleMethodAsync. When the awaited task is
    ' completed, this method resumes execution.
    Dim exampleInt As Integer = Await AwaitedProcessAsync()

    ' . . .

    ' The return statement completes the task. Any method that is
    ' awaiting ExampleMethodAsync can now get the integer result.
    Return exampleInt
End Function

Как правило, метод, измененный Async ключевое слово, содержит по крайней мере одно выражение или оператор Await. Метод выполняется синхронно до тех пор, пока не достигнет первой Awaitточки, в какой момент она приостанавливается до завершения ожидаемой задачи. В то же время элемент управления возвращается вызывающему объекту метода. Если метод не содержит Await выражения или инструкции, метод не приостановлен и выполняется как синхронный метод. Предупреждение компилятора предупреждает вас о любых асинхронных методах, которые не содержатся Await , так как эта ситуация может указывать на ошибку. Дополнительные сведения см. в статье об ошибке компилятора.

Ключевое слово Async — это незарезервированные ключевое слово. Это ключевое слово при изменении метода или лямбда-выражения. Во всех других контекстах он интерпретируется как идентификатор.

Типы возвращаемых данных

Асинхронный метод — это под-процедура или процедура-функция , которая имеет тип возвращаемого Task значения или Task<TResult>. Метод не может объявлять параметры ByRef .

Для возвращаемого типа асинхронного метода указывается Task(Of TResult) , если оператор Return метода имеет операнду типа TResult. Класс Task используется при отсутствии содержательного значения, возвращаемого методом при его завершении. То есть вызов метода возвращает значение Task, но после Task завершения любой Await инструкции, ожидающей Task , что результат не будет получен.

Асинхронные вложенные каналы используются в основном для определения обработчиков событий, в которых Sub требуется процедура. Вызывающий объект асинхронного подрутина не может ожидать его и не может перехватывать исключения, вызываемые методом.

Дополнительные сведения и примеры см. в разделе Асинхронные типы возвращаемых значений.

Пример

В следующих примерах показан асинхронный обработчик событий, асинхронное лямбда-выражение и асинхронный метод. Полный пример использования этих элементов см. в пошаговом руководстве. Доступ к Интернету с помощью Async и Await. Пример можно скачать из браузера примеров .NET. Пример кода находится в проекте SerialAsyncExample .

' An event handler must be a Sub procedure.
Async Sub button1_Click(sender As Object, e As RoutedEventArgs) Handles button1.Click
    textBox1.Clear()
    ' SumPageSizesAsync is a method that returns a Task.
    Await SumPageSizesAsync()
    textBox1.Text = vbCrLf & "Control returned to button1_Click."
End Sub

' The following async lambda expression creates an equivalent anonymous
' event handler.
AddHandler button1.Click, Async Sub(sender, e)
                              textBox1.Clear()
                              ' SumPageSizesAsync is a method that returns a Task.
                              Await SumPageSizesAsync()
                              textBox1.Text = vbCrLf & "Control returned to button1_Click."
                          End Sub

' The following async method returns a Task(Of T).
' A typical call awaits the Byte array result:
'      Dim result As Byte() = Await GetURLContents("https://msdn.com")
Private Async Function GetURLContentsAsync(url As String) As Task(Of Byte())

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

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

    ' Send the request to the Internet resource and wait for
    ' the response.
    Using response As WebResponse = Await webReq.GetResponseAsync()
        ' Get the data stream that is associated with the specified URL.
        Using responseStream As Stream = response.GetResponseStream()
            ' Read the bytes in responseStream and copy them to content.
            ' CopyToAsync returns a Task, not a Task<T>.
            Await responseStream.CopyToAsync(content)
        End Using
    End Using

    ' Return the result as a byte array.
    Return content.ToArray()
End Function

См. также