Async (Visual Basic)Async (Visual Basic)

Il modificatore Async indica che il metodo o l' espressione lambda modificata è asincrona.The Async modifier indicates that the method or lambda expression that it modifies is asynchronous. Questi metodi sono detti metodi asincroni.Such methods are referred to as async methods.

Un metodo asincrono è un modo pratico per eseguire le operazioni potenzialmente di lunga durata senza bloccare il thread del chiamante.An async method provides a convenient way to do potentially long-running work without blocking the caller's thread. Il chiamante di un metodo asincrono può riprendere il proprio lavoro senza attendere il completamento del metodo asincrono.The caller of an async method can resume its work without waiting for the async method to finish.

Nota

Le parole chiave Async e Await sono state introdotte in Visual Studio 2012.The Async and Await keywords were introduced in Visual Studio 2012. Per un'introduzione alla programmazione asincrona, vedere programmazione asincrona con Async e await.For an introduction to async programming, see Asynchronous Programming with Async and Await.

Nell'esempio seguente viene illustrata la struttura di un metodo async.The following example shows the structure of an async method. Per convenzione, i nomi dei metodi async terminano con "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

In genere, un metodo modificato dalla parola chiave Async contiene almeno un'espressione o un'istruzione await .Typically, a method modified by the Async keyword contains at least one Await expression or statement. Il metodo funziona in modo sincrono fino al primo Await, a quel punto viene sospeso finché l'attività di cui si è in attesa non viene completata.The method runs synchronously until it reaches the first Await, at which point it suspends until the awaited task completes. Nel frattempo, il controllo viene restituito al chiamante del metodo.In the meantime, control is returned to the caller of the method. Se il metodo non contiene un'espressione o un'istruzione Await, il metodo non viene sospeso e viene eseguito come un metodo sincrono.If the method doesn’t contain an Await expression or statement, the method isn’t suspended and executes as a synchronous method does. Un avviso del compilatore segnala eventuali metodi asincroni che non contengono Await perché questa situazione potrebbe indicare un errore.A compiler warning alerts you to any async methods that don't contain Await because that situation might indicate an error. Per ulteriori informazioni, vedere l' errore del compilatore.For more information, see the compiler error.

La parola chiave Async è una parola chiave non riservata.The Async keyword is an unreserved keyword. È una parola chiave quando si modifica un metodo o un'espressione lambda.It is a keyword when it modifies a method or a lambda expression. In tutti gli altri contesti, viene interpretata come identificatore.In all other contexts, it is interpreted as an identifier.

Tipi restituitiReturn Types

Un metodo asincrono può essere una routine Sub o una routine di funzione con un tipo restituito Task o Task<TResult>.An async method is either a Sub procedure, or a Function procedure that has a return type of Task or Task<TResult>. Il metodo non può dichiarare parametri ByRef .The method cannot declare any ByRef parameters.

Specificare Task(Of TResult) per il tipo restituito di un metodo asincrono se l'istruzione return del metodo ha un operando di tipo 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. Utilizzare Task se non viene restituito alcun valore significativo al completamento del metodo.You use Task if no meaningful value is returned when the method is completed. In altre parole, una chiamata al metodo restituisce Task, ma quando Task viene completato, ogni istruzione Await in attesa di Task non produce un valore risultante.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.

Le subroutine async vengono utilizzate principalmente per definire i gestori eventi in cui è richiesta una procedura Sub.Async subroutines are used primarily to define event handlers where a Sub procedure is required. Il chiamante di una subroutine async non può attendere il metodo e non può intercettare le eccezioni generate dal metodo.The caller of an async subroutine can't await it and can't catch exceptions that the method throws.

Per altre informazioni ed esempi, vedere Tipi restituiti asincroni.For more information and examples, see Async Return Types.

EsempioExample

Negli esempi seguenti viene illustrato un gestore eventi async, un'espressione lambda async e un metodo async.The following examples show an async event handler, an async lambda expression, and an async method. Per un esempio completo in cui vengono usati questi elementi, vedere procedura dettagliata: accesso al Web tramite Async e await.For a full example that uses these elements, see Walkthrough: Accessing the Web by Using Async and Await. È possibile scaricare il codice della procedura dettagliata dalla pagina Developer Code Samples (Esempi di codice per sviluppatori).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

Vedere ancheSee also