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)