Async (referência de C#)

O modificador de async indica que o método, expressão lambda, ou método anônimo que altera são assíncronas.Esses métodos são chamados métodos de async.

Um método de async fornece uma maneira conveniente de fazer o trabalho potencialmente longo sem bloqueio do segmento chamador.O chamador de um método de async seu trabalho pode continuar sem esperar o método de async para concluir.

ObservaçãoObservação

As palavras-chave de async e de await foram introduzidos no Visual Studio 2012.Para obter informações sobre outros recursos novos na versão, consulte Novidades no Visual Studio 2012 RC.

Para obter uma introdução à programação de async, consulte Programação com Async assíncrona e esperar (C# e Visual Basic).

O exemplo a seguir mostra a estrutura de um manipulador de eventos de async, StartButton_Click, que chama um método de async, ExampleMethodAsync.O resultado do método é o comprimento de um site baixada.O código é apropriado para Windows Presentation Foundation (WPF) ou aplicativo da Windows Store.

// 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;
}
Observação importanteImportante

Para um exemplo completo WPF que usa os elementos semelhantes, consulte Passo a passo: Acessando a Web usando Async e aguardar (C# e Visual Basic).Você pode baixar o código da explicação passo a passo de Exemplos de código do desenvolvedor.

Normalmente, um método modificado pela palavra-chave de async contém pelo menos uma expressão ou instrução de espere .O método executa sincronamente até que atinja a primeira expressão de await , o ponto em que ele é suspenso até que a tarefa esperada seja concluída.Entretanto, o controle é retornado para o chamador do método.Se o método não contém uma expressão de await declaração ou, então executar forma síncrona.Alertas de aviso do compilador a você alguns métodos de async que não contêm await porque essa situação pode indicar um erro.Para obter mais informações, consulte Aviso do compilador (nível 1) CS4014.

A palavra-chave de async é uma palavra-chave contextual.É uma palavra-chave quando altera um método, uma expressão lambda, ou um método anônimo.Em todos contextos outros, é interpretado como um identificador.

Tipos de retorno

Um método de async pode ter um tipo de retorno de Task, de Task<TResult>, ou de vácuo.O método não pode declarar nenhum parâmetro de referência ou de out , embora possa chamar os métodos que têm esses parâmetros.

Você especifica Task<TResult> como o tipo de retorno de um método de async se a instrução de retorno do método especifica um operando do tipo TResult.Você usa Task se nenhum valor significativo é retornado quando o método for concluído.Ou seja, uma chamada para o método retorna Task, mas quando Task terminar, qualquer expressão de await que aguardar Task avalia como nulo.

O tipo de retorno de void é basicamente usado para definir os manipuladores de eventos, onde um tipo de retorno de void é necessário.O chamador de um método vago- retornando de async não pode aguardar e não pode capturar exceções que o gera o método.

Para mais informações e exemplos, consulte Tipos de retorno de Async (C# e Visual Basic).

Consulte também

Tarefas

Passo a passo: Acessando a Web usando Async e aguardar (C# e Visual Basic)

Referência

aguardar (referência de C#)

AsyncStateMachineAttribute

Conceitos

Programação com Async assíncrona e esperar (C# e Visual Basic)