Condividi tramite


Opertore Await (Visual Basic)

Si applica l'operatore di Await a un operando in un metodo o in un'espressione lambda asincrono per sospendere l'esecuzione del metodo finché l'attività attesa non completi.L'attività rappresenta il lavoro in corso.

Il metodo in cui Await viene utilizzato deve avere un modificatore di Async.Tale metodo, definito utilizzando il modificatore di Async e in genere contiene una o più espressioni di Await, viene definito un metodo async.

[!NOTA]

Le parole chiave di Await e di Async furono introdotte in Visual Studio 2012.Per informazioni sulle nuove funzionalità della versione, vedere Novità di Visual Studio 2012.

Per un'introduzione alla programmazione async, vedere Programmazione asincrona con Async e Await (C# e Visual Basic).

In genere, l'attività a cui si applica l'operatore di Await è il valore restituito da una chiamata a un metodo che implementa Il modello asincrono basato su attività, ovvero, Task o Task<TResult>.

Nel codice seguente, il metodo GetByteArrayAsync di HttpClient restituisce getContentsTask, Task(Of Byte()).L'attività è un suggerimento per produrre l'effettiva matrice di byte quando l'operazione viene completata.L'operatore di Await viene applicato a getContentsTask di sospendere l'esecuzione in SumPageSizesAsync finché getContentsTask non sia completo.Contemporaneamente, il controllo viene restituito al chiamante di SumPageSizesAsync.Quando getContentsTask viene completata, l'espressione di Await restituisce una matrice di byte.

Private Async Function SumPageSizesAsync() As Task

    ' To use the HttpClient type in desktop apps, you must include a using directive and add a 
    ' reference for the System.Net.Http namespace.
    Dim client As HttpClient = New HttpClient() 
    ' . . . 
    Dim getContentsTask As Task(Of Byte()) = client.GetByteArrayAsync(url)
    Dim urlContents As Byte() = Await getContentsTask

    ' Equivalently, now that you see how it works, you can write the same thing in a single line.
    'Dim urlContents As Byte() = Await client.GetByteArrayAsync(url)
    ' . . .
End Function
Nota importanteImportante

Per l'esempio completo, vedere Procedura dettagliata: accesso al Web tramite Async e Await (C# e Visual Basic).È possibile scaricare l'esempio Esempi di codice dello sviluppatore del sito Web Microsoft.L'esempio è nel progetto AsyncWalkthrough_HttpClient.

Se Await si applica al risultato di una chiamata a metodo che restituisce Task(Of TResult), il tipo di Await è TResult.Se Await si applica al risultato di una chiamata a metodo che restituisce Task, l'espressione di Await non restituisce un valore.Il seguente esempio viene illustrata la differenza.

' Await used with a method that returns a Task(Of TResult).
Dim result As TResult = Await AsyncMethodThatReturnsTaskTResult()

' Await used with a method that returns a Task.
Await AsyncMethodThatReturnsTask()

Un'espressione o un'istruzione di Await non blocca il thread su cui è in esecuzione.Invece, indica al compilatore di firmare il resto del metodo async, dopo l'espressione di Await, ad esempio una continuazioneattività in attesa.Proprietà del controllo restituisce quindi al chiamante del metodo async.Quando l'attività termina, richiama la relativa continuazione e l'esecuzione del metodo async riattiva in cui il processo è stato interrotto.

Un'espressione di Await può verificarsi solo immediatamente nel corpo di un metodo contenitore o di un'espressione lambda che è contrassegnata da un modificatore di Async.Il termine attesa funge la parola chiave solo in tale contesto.Altrove, viene interpretato come l'identificatore.Nel metodo o dell'espressione lambda async, un'espressione di Await non può verificarsi in un'espressione di query, nel blocco di finally o di catch di un'istruzione di Catch try…… finally, nell'espressione di variabile di controllo ciclo di un ciclo di For Each o di For, o nel corpo di un'istruzione di SyncLock.

Eccezioni

La maggior parte dei metodi async restituiscono Task o Task<TResult>.Le proprietà dell'attività restituita contengono informazioni sullo stato e cronologia, come se l'attività è completa, se il metodo async provoca un'eccezione o è stato annullato e il risultato finale è.L'operatore di Await accede a tali proprietà.

Se si attendono un metodo attività- restituendo async che provoca un'eccezione, vengono rigenerate l'operatore di Await l'eccezione.

Se si attendono un metodo attività- restituendo async che viene annullato, i rigenerate l'operatore di AwaitOperationCanceledException.

Una singola attività nello stato Faulted rifletta più eccezioni.Ad esempio, un'attività potrebbe essere il risultato di una chiamata a Task.WhenAll.Quando si attendono tale attività, i rigenerate solo una delle operazioni di attesa delle eccezioni.Tuttavia, non è possibile prevedere che le eccezioni di nuovo.

Per esempi di gestione degli errori nei metodi async, vedere Istruzione Try...Catch...Finally (Visual Basic).

Esempio

Nell'esempio di Windows Form viene illustrato l'utilizzo di Await in un metodo async, WaitAsynchronouslyAsync.Contrapporre il comportamento di tale metodo con il comportamento di WaitSynchronously.Senza un operatore di Await, WaitSynchronously viene eseguita in modo sincrono nonostante il modificatore di Async nella definizione e in una chiamata a Thread.Sleep nel corpo.

Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    ' Call the method that runs asynchronously.
    Dim result As String = Await WaitAsynchronouslyAsync()

    ' Call the method that runs synchronously.
    'Dim result As String = Await WaitSynchronously()

    ' Display the result.
    TextBox1.Text &= result
End Sub

' The following method runs asynchronously. The UI thread is not
' blocked during the delay. You can move or resize the Form1 window 
' while Task.Delay is running.
Public Async Function WaitAsynchronouslyAsync() As Task(Of String)
    Await Task.Delay(10000)
    Return "Finished"
End Function

' The following method runs synchronously, despite the use of Async.
' You cannot move or resize the Form1 window while Thread.Sleep
' is running because the UI thread is blocked.
Public Async Function WaitSynchronously() As Task(Of String)
    ' Import System.Threading for the Sleep method.
    Thread.Sleep(10000)
    Return "Finished"
End Function

Vedere anche

Attività

Procedura dettagliata: accesso al Web tramite Async e Await (C# e Visual Basic)

Riferimenti

Async (Visual Basic)

Concetti

Programmazione asincrona con Async e Await (C# e Visual Basic)