Condividi tramite


async (Riferimenti per C#)

Il modificatore di async indica che il metodo, espressione lambda, o metodo anonimo che modifica è asincroni.Tali metodi sono definiti i metodi async.

Un metodo async fornisce un modo pratico per eseguire il lavoro potenzialmente prolungata senza bloccare il thread del chiamante.Il chiamante di un metodo async può riattivare il proprio lavoro senza attendere il metodo async per completare.

[!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).

Nell'esempio seguente viene mostrata la struttura di un gestore eventi async, StartButton_Click, che chiama un metodo async, ExampleMethodAsync.Il risultato del metodo è la lunghezza di un sito Web scaricata.Il codice è adatto per Windows Presentation Foundation (WPF) o le finestre dell'applicazione.

// In desktop apps that you create by using Visual Studio 2012, you must 
// add a reference and a using directive for System.Net.Http.
// In Windows Store apps, you must add using directives for System.Net.Http 
// and System.Threading.Tasks.

private async void StartButton_Click(object sender, RoutedEventArgs e)
{
    // ExampleMethodAsync returns a Task<int> and has an int result.
    // A value is assigned to intTask when ExampleMethodAsync reaches
    // an await.
    try
    {
        Task<int> intTask = ExampleMethodAsync();
        // You can do other work here that doesn't require the result from
        // ExampleMethodAsync. . . .
        // You can access the int result when ExampleMethodAsync completes.
        int intResult = await intTask;
    
        // Or you can combine the previous two steps:
        //int intResult = await ExampleMethodAsync();

        // Process the result (intResult). . . .
    }
    catch (Exception)
    {
        // Process the exception. . . .
    }
}

public async Task<int> ExampleMethodAsync()
{
    var httpClient = new HttpClient();

    // At the await expression, execution in this method is suspended, and
    // control returns to the caller of ExampleMethodAsync.
    // Variable exampleInt is assigned a value when GetStringAsync completes.
    int exampleInt = (await httpClient.GetStringAsync("https://msdn.microsoft.com")).Length;

    // You can break the previous line into several steps to clarify what happens:
    //Task<string> contentsTask = httpClient.GetStringAsync("https://msdn.microsoft.com");
    //string contents = await contentsTask;
    //int exampleInt = contents.Length; 

    // Continue with whatever processing is waiting for exampleInt. . . .

    // After the return statement, any method that's awaiting
    // ExampleMethodAsync can get the integer result.
    return exampleInt;
}
Nota importanteImportante

Per un esempio completo di WPF che utilizza gli elementi simili, vedere Procedura dettagliata: accesso al Web tramite Async e Await (C# e Visual Basic).È possibile scaricare il codice della procedura dettagliata da Esempi di codice dello sviluppatore.

In genere, un metodo modificato dalla parola chiave di async contiene almeno un un'espressione o istruzione di attendere.Il metodo funziona in modo sincrono fino alla prima espressione di await, al momento viene sospeso finché l'attività attesa non sia completata.Contemporaneamente, il controllo viene restituito al chiamante del metodo.Se il metodo non contiene un'espressione di await un'istruzione o, quindi esegue in modo sincrono.Un avviso del compilatore segnala gli eventuali metodi async che non contengono await perché tale situazione potrebbe indicare un errore.Per ulteriori informazioni, vedere Avviso del compilatore (livello 1) CS4014.

La parola chiave di async è una parola chiave contestuale.È una parola chiave quando si modifica un metodo, un'espressione lambda, o un metodo anonimo.In tutti gli altri contesti, viene interpretato come l'identificatore.

Tipi restituiti

Un metodo async può avere un tipo restituito di Task, di Task<TResult>, o di void.Il metodo non può dichiarare parametri di indietro o di riferimento, sebbene possa chiamare i metodi che presentano tali parametri.

Specificare Task<TResult> come tipo restituito del metodo async se l'istruzione di ritorno del metodo specifica un operando di tipo TResult.Se si utilizza Task alcun valore significativo viene restituito quando il metodo viene completato.Ovvero una chiamata al metodo restituisce Task, ma quando Task viene completata, qualsiasi espressione di await in attesa di Task valuta per svuotare.

Il tipo restituito di void viene utilizzato principalmente per definire i gestori eventi, in cui un tipo restituito di void è obbligatorio.Il chiamante di un metodo void- restituendo async non è possibile attenderlo e non può intercettare le eccezioni che il metodo genera un'eccezione.

Per ulteriori informazioni ed esempi, vedere Tipi restituiti asincroni (C# e Visual Basic).

Vedere anche

Attività

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

Riferimenti

await (Riferimenti per C#)

AsyncStateMachineAttribute

Concetti

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