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çã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;
}
Importante |
---|
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
Conceitos
Programação com Async assíncrona e esperar (C# e Visual Basic)