Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
El Async modificador indica que el método o la expresión lambda que modifica es asincrónico. Estos métodos se conocen como métodos asincrónicos.
Un método asincrónico proporciona una manera cómoda de realizar un trabajo potencialmente de larga duración sin bloquear el subproceso del autor de la llamada. El autor de la llamada de un método asincrónico puede reanudar su trabajo sin esperar a que finalice el método asincrónico.
Nota:
Las Async palabras clave y Await se introdujeron en Visual Studio 2012. Para obtener una introducción a la programación asincrónica, consulte Programación asincrónica con Async y Await.
En el ejemplo siguiente se muestra la estructura de un método asincrónico. Por convención, los nombres de método asincrónico terminan en "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
Normalmente, un método modificado por la Async palabra clave contiene al menos una expresión o instrucción Await . El método se ejecuta sincrónicamente hasta que alcanza el primer Await, en cuyo punto se suspende hasta que se complete la tarea esperada. Mientras tanto, el control se devuelve al autor de la llamada del método . Si el método no contiene una expresión o instrucción Await , el método no se suspende y se ejecuta como un método sincrónico. Una advertencia del compilador le avisa a los métodos asincrónicos que no contienen Await porque esa situación podría indicar un error. Para obtener más información, consulte el error del compilador.
La Async palabra clave es una palabra clave no reservada. Es una palabra clave cuando modifica un método o una expresión lambda. En todos los demás contextos, se interpreta como un identificador.
Tipos de valor devueltos
Un método asincrónico es un procedimiento Sub o un procedimiento Function que tiene un tipo de valor devuelto de Task o Task<TResult>. El método no puede declarar ningún parámetro ByRef .
Task(Of TResult) Especifique para el tipo de valor devuelto de un método asincrónico si la instrucción Return del método tiene un operando de tipo TResult. Utilice Task si no se devuelve ningún valor significativo al completarse el método. Es decir, una llamada al método devuelve un Task, pero cuando Task se completa, cualquier Await instrucción que esté esperando Task no genere un valor de resultado.
Las subrutinas asincrónicas se usan principalmente para definir controladores de eventos en los que se requiere un Sub procedimiento. El autor de la llamada de una subrutina asincrónica no puede esperarlo y no puede detectar excepciones que produce el método.
Para más información y ejemplos, vea Tipos de valor devueltos asincrónicos.
Ejemplo
En los ejemplos siguientes se muestra un controlador de eventos asincrónico, una expresión lambda asincrónica y un método asincrónico. Para obtener un ejemplo completo que use estos elementos, vea Tutorial: Acceso a la web mediante Async y Await. Puede descargar el ejemplo desde el explorador de ejemplo de .NET. El código de ejemplo está en el proyecto 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