Async (Visual Basic)Async (Visual Basic)

AsyncМодификатор указывает, что метод или лямбда-выражение , которое он изменяет, является асинхронным.The Async modifier indicates that the method or lambda expression that it modifies is asynchronous. Такие методы называются асинхронными методами.Such methods are referred to as async methods.

Асинхронный метод представляет собой удобный способ для выполнения работы, которая может занять длительное время, без блокировки потока вызывающего объекта.An async method provides a convenient way to do potentially long-running work without blocking the caller's thread. Вызывающий метод асинхронного метода может возобновить свою работу, не дожидаясь завершения асинхронного метода.The caller of an async method can resume its work without waiting for the async method to finish.

Примечание

Ключевые слова Async и Await появились в Visual Studio 2012.The Async and Await keywords were introduced in Visual Studio 2012. Общие сведения о асинхронном программировании см. в статье Асинхронное программирование с использованием Async и await.For an introduction to async programming, see Asynchronous Programming with Async and Await.

В следующем примере показана структура асинхронного метода.The following example shows the structure of an async method. По соглашению имена асинхронных методов заканчиваются на "Async".By convention, async method names end in "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 .Typically, a method modified by the Async keyword contains at least one Await expression or statement. Метод выполняется синхронно до тех пор, пока не достигнет первого Await , после чего он приостанавливается до тех пор, пока не завершится ожидаемая задача.The method runs synchronously until it reaches the first Await, at which point it suspends until the awaited task completes. Пока Управление возвращается вызывающему методу метода.In the meantime, control is returned to the caller of the method. Если метод не содержит Await выражение или оператор, метод не приостанавливается и выполняется как синхронный метод.If the method doesn't contain an Await expression or statement, the method isn't suspended and executes as a synchronous method does. Предупреждение компилятора предупреждает о любых асинхронных методах, которые не содержат, Await так как такая ситуация может указывать на ошибку.A compiler warning alerts you to any async methods that don't contain Await because that situation might indicate an error. Дополнительные сведения см. в описании ошибки компилятора.For more information, see the compiler error.

AsyncКлючевое слово является незарезервированным ключевым словом.The Async keyword is an unreserved keyword. Это ключевое слово при изменении метода или лямбда-выражения.It is a keyword when it modifies a method or a lambda expression. Во всех остальных контекстах он интерпретируется как идентификатор.In all other contexts, it is interpreted as an identifier.

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

Асинхронный метод является либо подпроцедурой, либо процедурой функции , имеющей тип возвращаемого значения Task или Task<TResult> .An async method is either a Sub procedure, or a Function procedure that has a return type of Task or Task<TResult>. Метод не может объявлять никакие параметры ByRef .The method cannot declare any ByRef parameters.

Указывается Task(Of TResult) для возвращаемого типа асинхронного метода, если оператор return метода имеет операнд типа TResult.You specify Task(Of TResult) for the return type of an async method if the Return statement of the method has an operand of type TResult. Класс Task используется при отсутствии содержательного значения, возвращаемого методом при его завершении.You use Task if no meaningful value is returned when the method is completed. Это значит, что вызов метода возвращает Task , но после Task завершения любая Await инструкция, ожидающая, Task не формирует результирующее значение.That is, a call to the method returns a Task, but when the Task is completed, any Await statement that's awaiting the Task doesn’t produce a result value.

Асинхронные подпрограммы используются в основном для определения обработчиков событий, где Sub требуется процедура.Async subroutines are used primarily to define event handlers where a Sub procedure is required. Вызывающая сторона асинхронной подпрограммы не может ожидать ее и не может перехватывать исключения, которые вызывает метод.The caller of an async subroutine can't await it and can't catch exceptions that the method throws.

Дополнительные сведения и примеры см. в разделе Асинхронные типы возвращаемых значений.For more information and examples, see Async Return Types.

ПримерExample

В следующих примерах показан асинхронный обработчик событий, асинхронное лямбда-выражение и асинхронный метод.The following examples show an async event handler, an async lambda expression, and an async method. Полный пример использования этих элементов см. в разделе Пошаговое руководство. доступ к Интернету с помощью Async и await.For a full example that uses these elements, see Walkthrough: Accessing the Web by Using Async and Await. Код пошагового руководства можно скачать в разделе Примеры кода от разработчиков.You can download the walkthrough code from Developer Code Samples.

' 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

См. также разделSee also