Async (Visual Basic)

Async 修饰符指示该它进行修改方案或 lambda 表达式 是异步的。此类方法引用 异步方法。

异步方法提供了一种简便方式完成可能需要长时间运行的工作,而不必阻止调用方的线程。异步方法的调用方可以继续工作,而不必等待异步方法完成。

说明说明

Async 和 Await 关键字在 Visual Studio 2012 中引入)。有关在该版本的其他新增功能的信息,请参见 Visual Studio 2012 中的新增功能

有关异步编程的介绍,请参见 使用 Async 和 Await 的异步编程(C# 和 Visual Basic)

下面的示例演示异步方案的结构。按照约定,异步方法在“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 关键字是一个非保留的关键字。以便修改方法或 lambda 表达式时,它是关键字。在其他上下文,则将该说明符解释为标识符。

返回类型

异步方法是 程序或具有 TaskTask<TResult>的一个返回类型的 函数 程序。该方法不能声明任何 ByRef 参数。

如果方法的 返回 语句具有类型 TResult,操作将为异步方法的返回类型指定 Task(Of TResult) 。使用 Task,如果有意义的不返回值,在方法完成。即对方法的调用返回 Task,但是,随着 Task 完成时,等待 Task 的任何 Await 语句不会导致一个结果值。

"子例程主要用于定义需要 Sub 程序的事件处理程序。"子例程的调用方不等待它无法捕获方法引发的异常。

有关更多信息和示例,请参见异步返回类型(C# 和 Visual Basic)

示例

下面的示例演示一个异步事件处理程序、一个异步 lambda 表达式和一个异步方法。有关使用这些元素的完整示例,请参见 演练:使用 Async 和 Await 访问 Web(C# 和 Visual Basic)。可以下载演练中的代码 开发人员代码示例

' 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

请参见

任务

演练:使用 Async 和 Await 访问 Web(C# 和 Visual Basic)

参考

Await 运算符 (Visual Basic)

AsyncStateMachineAttribute

概念

使用 Async 和 Await 的异步编程(C# 和 Visual Basic)