aguardar (referência de C#)
O operador de await é aplicado a uma tarefa em um método assíncrono suspender a execução do método até que a tarefa deve terminar.A tarefa representa trabalho contínuo.
O método assíncrono que é usado em await deve ser modificado pela palavra-chave de async .Método, definido usando o modificador de async , e geralmente contendo uma ou mais expressões de await , é conhecido como um método de async.
Observação |
---|
As palavras-chave de async e de await foram introduzidos no Visual Studio 2012.Para obter informações sobre novos recursos nesta 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). |
A tarefa a qual o operador de await é aplicado normalmente é o valor de retorno de uma chamada a um método que implementa Padrão assíncrono baseado chave.Os exemplos incluem valores do tipo Task ou Task<TResult>.
No código a seguir, o método GetByteArrayAsync de HttpClient retorna Task<byte[]>, getContentsTask.A tarefa é uma promessa gerar real da matriz de bytes quando a tarefa é concluída.O operador de await é aplicado a getContentsTask para suspender a execução em SumPageSizesAsync até que getContentsTask seja concluída.Entretanto, o controle é retornado para o chamador de SumPageSizesAsync.Quando getContentsTask terminar, a expressão de await avalia como uma matriz de bytes.
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);
// . . .
}
Importante |
---|
Para um exemplo completo, consulte Passo a passo: Acessando a Web usando Async e aguardar (C# e Visual Basic).Você pode baixar o exemplo Exemplos de código do desenvolvedor no site da Microsoft.O exemplo está no projeto de AsyncWalkthrough_HttpClient. |
Conforme mostrado no exemplo anterior, se await é aplicado ao resultado de uma chamada de método que retorna Task<TResult>, o tipo da expressão de await é TResult.Se await é aplicado ao resultado de uma chamada de método que retorna Task, o tipo da expressão de await é vago.O exemplo a seguir ilustra a diferença.
// 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();
Uma expressão de await não bloqueia o thread em que está executando o.Em vez disso, faz com que o compilador assine anterior o restante do método de async como uma continuação na tarefa esperada.O controle retorna para o chamador do método de async.Quando a tarefa termina, chama sua continuação, e a execução do método de async continua onde parou.
Uma expressão de await pode ocorrer apenas no corpo de um método imediatamente, incluindo de expressão lambda, ou de método anônimo que é marcado por um modificador de async .O termo espera serve como uma palavra-chave somente nesse contexto.Em outro lugar, é interpretado como um identificador.No método, a expressão lambda, ou o método anônimo, uma expressão de await não pode ocorrer no corpo de uma função síncrono, em uma expressão de consulta, no bloco de catch ou de finally de declaração de manipulação de exceção, no bloco de instrução de bloqueio, ou em um contexto de não seguro .
Exceções
A maioria dos métodos de async retornam Task ou Task<TResult>.As propriedades de tarefa retornado transportam informações sobre seus status e histórico, como se a tarefa estiver concluída, se o método de async causou a exceção ou esteve cancelado, e o que o resultado final é.O operador de await acessar essas propriedades.
Se você pretende ajustar um método retornando de async que causa uma exceção, os rethrows de operador de await a exceção.
Se você pretende ajustar um método retornando de async que foi cancelado, os rethrows de operador de awaitOperationCanceledException.
Uma única tarefa que está em um estado criticado é possível refletir várias exceções.Por exemplo, a tarefa pode ser o resultado de uma chamada a Task.WhenAll.Quando você espera uma tarefa, os rethrows apenas um da operação de espera de exceções.No entanto, você não pode prever de exceções que é rethrown.
Para exemplos de manipulação de erro de métodos de async, consulte try-catch (referência de C#).
Exemplo
O exemplo de formulários do Windows ilustra o uso de await em um método de async, WaitAsynchronouslyAsync.Contraste o comportamento desse método com o comportamento de WaitSynchronously.Sem um operador de await aplicado a uma tarefa, WaitSynchronously executa sincronamente independentemente do uso do modificador de async na sua definição e em uma chamada para Thread.Sleep no 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";
}
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)