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 表达式时,它是关键字。在其他上下文,则将该说明符解释为标识符。
返回类型
异步方法是 子 程序或具有 Task 或 Task<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)