Condividi tramite


await (Riferimenti per C#)

L'operatore di await si applica a un'attività in un metodo asincrono sospendere l'esecuzione del metodo finché l'attività attesa non completi.L'attività rappresenta il lavoro in corso.

Il metodo asincrono in cui await viene utilizzato deve essere modificato dalla parola chiave 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).

L'attività a cui l'operatore di await viene applicata in genere è il valore restituito da una chiamata a un metodo che implementa Il modello asincrono basato su attività.Gli esempi includono valori di tipo Task o Task<TResult>.

Nel codice seguente, il metodo GetByteArrayAsync di HttpClient restituisce Task<byte[]>, getContentsTask.L'attività è un suggerimento per produrre l'effettiva matrice di byte quando l'attività è completa.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 Task SumPageSizesAsync()
{
    // To use the HttpClient type in desktop apps, you must include a using directive and add a 
    // reference for the System.Net.Http namespace.
    HttpClient client = new HttpClient();
    // . . .
    Task<byte[]> getContentsTask = client.GetByteArrayAsync(url);
    byte[] urlContents = await getContentsTask;

    // Equivalently, now that you see how it works, you can write the same thing in a single line.
    //byte[] urlContents = await client.GetByteArrayAsync(url);
    // . . .
}
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.

Come illustrato nell'esempio precedente, se await si applica al risultato di una chiamata a metodo che restituisce Task<TResult>, il tipo di await è TResult.Se await si applica al risultato di una chiamata a metodo che restituisce Task, il tipo di await è void.Il seguente esempio viene illustrata la differenza.

// Keyword await used with a method that returns a Task<TResult>.
TResult result = await AsyncMethodThatReturnsTaskTResult();

// Keyword await used with a method that returns a Task.
await AsyncMethodThatReturnsTask();

Un'espressione di await non blocca il thread su cui è in esecuzione.Invece, indica al compilatore di firmare il resto del metodo async come 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, di un'espressione lambda, o un metodo anonimo contrassegnato da un modificatore di async.Il termine attesa funge la parola chiave solo in tale contesto.Altrove, viene interpretato come l'identificatore.Nel metodo, dell'espressione lambda, o del metodo anonimo, un'espressione di await non può verificarsi nel corpo di una funzione sincrona, in un'espressione di query, nel blocco di finally o di catch di istruzione di gestione delle eccezioni, nel blocco di un'istruzione lock, o in un contesto di unsafe.

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 try-catch (Riferimenti per C#).

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 applicato a un'attività, WaitSynchronously viene eseguita in modo sincrono nonostante il modificatore di async nella definizione e in una chiamata a Thread.Sleep nel corpo.

private async void button1_Click(object sender, EventArgs e)
{
    // Call the method that runs asynchronously.
    string result = await WaitAsynchronouslyAsync();

    // Call the method that runs synchronously.
    //string result = await WaitSynchronously ();

    // Display the result.
    textBox1.Text += result;
}

// 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 Task<string> WaitAsynchronouslyAsync()
{
    await Task.Delay(10000);
    return "Finished";
}

// 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 Task<string> WaitSynchronously()
{
    // Add a using directive for System.Threading.
    Thread.Sleep(10000);
    return "Finished";
}

Vedere anche

Attività

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

Riferimenti

async (Riferimenti per C#)

Concetti

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