Modelo de programação assíncrona de tarefaTask asynchronous programming model

É possível evitar gargalos de desempenho e aprimorar a resposta geral do seu aplicativo usando a programação assíncrona.You can avoid performance bottlenecks and enhance the overall responsiveness of your application by using asynchronous programming. No entanto, as técnicas tradicionais para escrever aplicativos assíncronos podem ser complicadas, dificultando sua escrita, depuração e manutenção.However, traditional techniques for writing asynchronous applications can be complicated, making them difficult to write, debug, and maintain.

O C# 5 apresentou uma programação assíncrona de abordagem simplificada que aproveita o suporte assíncrono no .NET Framework 4.5 e superior, no .NET Core e no Windows Runtime.C# 5 introduced a simplified approach, async programming, that leverages asynchronous support in the .NET Framework 4.5 and higher, .NET Core, and the Windows Runtime. O compilador faz o trabalho difícil que o desenvolvedor costumava fazer, e seu aplicativo mantém a estrutura lógica que se assemelha ao código síncrono.The compiler does the difficult work that the developer used to do, and your application retains a logical structure that resembles synchronous code. Como resultado, você obtém todas as vantagens da programação assíncrona com uma fração do esforço.As a result, you get all the advantages of asynchronous programming with a fraction of the effort.

Este tópico oferece uma visão geral de quando e como usar a programação assíncrona e inclui links para tópicos de suporte que contêm detalhes e exemplos.This topic provides an overview of when and how to use async programming and includes links to support topics that contain details and examples.

O Async melhora a capacidade de respostaAsync improves responsiveness

A assincronia é essencial para atividades que são potencialmente de bloqueio, como o acesso via Web.Asynchrony is essential for activities that are potentially blocking, such as web access. O acesso a um recurso da Web às vezes é lento ou atrasado.Access to a web resource sometimes is slow or delayed. Se tal atividade for bloqueada em um processo síncrono, todo o aplicativo deverá esperar.If such an activity is blocked in a synchronous process, the entire application must wait. Em um processo assíncrono, o aplicativo poderá prosseguir com outro trabalho que não dependa do recurso da Web até a tarefa potencialmente causadora do bloqueio terminar.In an asynchronous process, the application can continue with other work that doesn't depend on the web resource until the potentially blocking task finishes.

A tabela a seguir mostra a áreas típicas onde a programação assíncrona melhora a resposta.The following table shows typical areas where asynchronous programming improves responsiveness. As APIs listadas do .NET e do Windows Runtime contêm métodos que dão suporte à programação assíncrona.The listed APIs from .NET and the Windows Runtime contain methods that support async programming.

Área do aplicativoApplication area Tipos .NET com métodos assíncronos.NET types with async methods Tipos Windows Runtime com métodos assíncronosWindows Runtime types with async methods
Acesso à WebWeb access HttpClient Windows.Web.Http.HttpClient
SyndicationClient
Trabalhando com arquivosWorking with files JsonSerializer
StreamReader
StreamWriter
XmlReader
XmlWriter
StorageFile
Trabalhando com imagensWorking with images MediaCapture
BitmapEncoder
BitmapDecoder
Programação WCFWCF programming Operações síncronas e assíncronasSynchronous and Asynchronous Operations

A assincronia é especialmente importante para aplicativos que acessam o thread de interface de usuário porque todas as atividades relacionadas à interface do usuário normalmente compartilham um único thread.Asynchrony proves especially valuable for applications that access the UI thread because all UI-related activity usually shares one thread. Se um processo for bloqueado em um aplicativo síncrono, todos serão bloqueados.If any process is blocked in a synchronous application, all are blocked. Seu aplicativo para de responder, o que poderia levar você a concluir que ele falhou quando, na verdade, está apenas aguardando.Your application stops responding, and you might conclude that it has failed when instead it's just waiting.

Quando você usa métodos assíncronos, o aplicativo continua a responder à interface do usuário.When you use asynchronous methods, the application continues to respond to the UI. Você poderá redimensionar ou minimizar uma janela, por exemplo, ou fechar o aplicativo se você não desejar aguardar sua conclusão.You can resize or minimize a window, for example, or you can close the application if you don't want to wait for it to finish.

A abordagem baseada em assincronia adiciona o equivalente de uma transmissão automática à lista de opções disponíveis para escolha ao criar operações assíncronas.The async-based approach adds the equivalent of an automatic transmission to the list of options that you can choose from when designing asynchronous operations. Ou seja, você obtém todos os benefícios da programação assíncrona tradicional, mas com muito menos esforço do desenvolvedor.That is, you get all the benefits of traditional asynchronous programming but with much less effort from the developer.

Os métodos assíncronos são fáceis de escreverAsync methods are easy to write

As palavras-chave async e await em C# são a parte central da programação assíncrona.The async and await keywords in C# are the heart of async programming. Usando essas duas palavras-chave, você pode usar recursos no .NET Framework, no .NET Core ou no Windows Runtime para criar um método assíncrono quase tão fácil quanto criar um método síncrono.By using those two keywords, you can use resources in .NET Framework, .NET Core, or the Windows Runtime to create an asynchronous method almost as easily as you create a synchronous method. Os métodos assíncronos que você define usando a palavra-chave async são chamados de métodos assíncronos.Asynchronous methods that you define by using the async keyword are referred to as async methods.

O exemplo a seguir mostra um método assíncrono.The following example shows an async method. Quase tudo no código deve parecer familiar para você.Almost everything in the code should look familiar to you.

Você pode encontrar um exemplo completo de Windows Presentation Foundation (WPF) disponível para download da programação assíncrona com Async e Await em C#.You can find a complete Windows Presentation Foundation (WPF) example available for download from Asynchronous programming with async and await in C#.

public async Task<int> GetUrlContentLengthAsync()
{
    var client = new HttpClient();

    Task<string> getStringTask =
        client.GetStringAsync("https://docs.microsoft.com/dotnet");

    DoIndependentWork();

    string contents = await getStringTask;

    return contents.Length;
}

void DoIndependentWork()
{
    Console.WriteLine("Working...");
}

Você pode aprender várias práticas com a amostra anterior.You can learn several practices from the preceding sample. Comece com a assinatura do método.Start with the method signature. Ele inclui o modificador async.It includes the async modifier. O tipo de retorno é Task<int> (confira a seção "Tipos de retorno" para obter mais opções).The return type is Task<int> (See "Return Types" section for more options). O nome do método termina com Async.The method name ends in Async. No corpo do método, GetStringAsync retorna uma Task<string>.In the body of the method, GetStringAsync returns a Task<string>. Isso significa que, quando você executar await em uma tarefa, obterá uma string (contents).That means that when you await the task you'll get a string (contents). Antes de aguardar a tarefa, você poderá fazer um trabalho que não dependa da string em GetStringAsync.Before awaiting the task, you can do work that doesn't rely on the string from GetStringAsync.

Preste muita atenção no operador await.Pay close attention to the await operator. Ele suspende GetUrlContentLengthAsync :It suspends GetUrlContentLengthAsync:

  • GetUrlContentLengthAsync não poderá continuar enquanto getStringTask não for concluída.GetUrlContentLengthAsync can't continue until getStringTask is complete.
  • Enquanto isso, o controle é retornado ao chamador de GetUrlContentLengthAsync.Meanwhile, control returns to the caller of GetUrlContentLengthAsync.
  • O controle será retomado aqui quando a getStringTask for concluída.Control resumes here when getStringTask is complete.
  • Em seguida, o operador await recupera o resultado string de getStringTask.The await operator then retrieves the string result from getStringTask.

A instrução de retorno especifica um resultado inteiro.The return statement specifies an integer result. Os métodos que estão aguardando GetUrlContentLengthAsync recuperar o valor de comprimento.Any methods that are awaiting GetUrlContentLengthAsync retrieve the length value.

Se GetUrlContentLengthAsync não tiver nenhum trabalho que possa fazer entre chamar GetStringAsync e aguardar a conclusão, você poderá simplificar o código ao chamar e esperar na instrução única a seguir.If GetUrlContentLengthAsync doesn't have any work that it can do between calling GetStringAsync and awaiting its completion, you can simplify your code by calling and awaiting in the following single statement.

string contents = await client.GetStringAsync("https://docs.microsoft.com/dotnet");

As características a seguir resumem o que torna o exemplo anterior um método assíncrono:The following characteristics summarize what makes the previous example an async method:

  • A assinatura do método inclui um modificador async.The method signature includes an async modifier.

  • O nome de um método assíncrono, por convenção, termina com um sufixo "Async".The name of an async method, by convention, ends with an "Async" suffix.

  • O tipo de retorno é um dos seguintes tipos:The return type is one of the following types:

    • Task<TResult> se o método possui uma instrução de retorno em que o operando tem o tipo TResult.Task<TResult> if your method has a return statement in which the operand has type TResult.
    • Task se o método não possui instrução de retorno alguma ou se ele possui uma instrução de retorno sem operando.Task if your method has no return statement or has a return statement with no operand.
    • void se você estiver escrevendo um manipulador de eventos assíncronos.void if you're writing an async event handler.
    • Qualquer outro tipo que tenha um método GetAwaiter (começando com o C# 7.0).Any other type that has a GetAwaiter method (starting with C# 7.0).

    Para obter mais informações, consulte a seção tipos de retorno e parâmetros .For more information, see the Return types and parameters section.

  • O método geralmente inclui, pelo menos, uma expressão await, que marca um ponto em que o método não poderá continuar enquanto a operação assíncrona aguardada não for concluída.The method usually includes at least one await expression, which marks a point where the method can't continue until the awaited asynchronous operation is complete. Enquanto isso, o método é suspenso e o controle retorna para o chamador do método.In the meantime, the method is suspended, and control returns to the method's caller. A próxima seção deste tópico ilustra o que acontece no ponto de suspensão.The next section of this topic illustrates what happens at the suspension point.

Em métodos assíncronos, você usa as palavras-chave e os tipos fornecidos para indicar o que deseja fazer, e o compilador faz o resto, inclusive acompanhar o que deve acontecer quando o controle retorna a um ponto de espera em um método suspenso.In async methods, you use the provided keywords and types to indicate what you want to do, and the compiler does the rest, including keeping track of what must happen when control returns to an await point in a suspended method. Alguns processos de rotina, como loops e a manipulação de exceções, podem ser difíceis de manipular em um código assíncrono tradicional.Some routine processes, such as loops and exception handling, can be difficult to handle in traditional asynchronous code. Em um método assíncrono, você escreve esses elementos da mesma forma que faria em uma solução síncrona, e o problema é resolvido.In an async method, you write these elements much as you would in a synchronous solution, and the problem is solved.

Para obter mais informações sobre assincronia em versões anteriores do .NET Framework, consulte tpl e programação assíncrona de .NET Framework tradicional.For more information about asynchrony in previous versions of .NET Framework, see TPL and traditional .NET Framework asynchronous programming.

O que acontece em um método assíncronoWhat happens in an async method

O mais importante que você deve compreender na programação assíncrona é a forma como o fluxo de controle avança de um método para outro.The most important thing to understand in asynchronous programming is how the control flow moves from method to method. O diagrama a seguir pode ser usado para conduzi-lo pelo processo:The following diagram leads you through the process:

Navegação de rastreamento do fluxo de controle assíncrono

Os números no diagrama correspondem às etapas a seguir, iniciadas quando um método de chamada chama o método Async.The numbers in the diagram correspond to the following steps, initiated when a calling method calls the async method.

  1. Um método de chamada chama e aguarda o GetUrlContentLengthAsync método Async.A calling method calls and awaits the GetUrlContentLengthAsync async method.

  2. GetUrlContentLengthAsync cria uma instância de HttpClient e chama o método assíncrono GetStringAsync para baixar o conteúdo de um site como uma cadeia de caracteres.GetUrlContentLengthAsync creates an HttpClient instance and calls the GetStringAsync asynchronous method to download the contents of a website as a string.

  3. Algo acontece em GetStringAsync que suspende o andamento.Something happens in GetStringAsync that suspends its progress. Talvez ele deva aguardar o download de um site ou alguma outra atividade causadora de bloqueio.Perhaps it must wait for a website to download or some other blocking activity. Para evitar o bloqueio de recursos, GetStringAsync transfere o controle para seu chamador, GetUrlContentLengthAsync.To avoid blocking resources, GetStringAsync yields control to its caller, GetUrlContentLengthAsync.

    GetStringAsync retorna um Task<TResult>, em que TResult é uma cadeia de caracteres, e GetUrlContentLengthAsync atribui a tarefa à variável getStringTask.GetStringAsync returns a Task<TResult>, where TResult is a string, and GetUrlContentLengthAsync assigns the task to the getStringTask variable. A tarefa representa o processo contínuo para a chamada a GetStringAsync, com um compromisso de produzir um valor de cadeia de caracteres real quando o trabalho estiver concluído.The task represents the ongoing process for the call to GetStringAsync, with a commitment to produce an actual string value when the work is complete.

  4. Como o getStringTask ainda não foi esperado, GetUrlContentLengthAsync pode continuar com outro trabalho que não depende do resultado final de GetStringAsync.Because getStringTask hasn't been awaited yet, GetUrlContentLengthAsync can continue with other work that doesn't depend on the final result from GetStringAsync. O trabalho é representado por uma chamada ao método síncrono DoIndependentWork.That work is represented by a call to the synchronous method DoIndependentWork.

  5. DoIndependentWork é um método síncrono que faz seu trabalho e retorna ao seu chamador.DoIndependentWork is a synchronous method that does its work and returns to its caller.

  6. GetUrlContentLengthAsync está sem trabalho que ele possa executar sem um resultado de getStringTask.GetUrlContentLengthAsync has run out of work that it can do without a result from getStringTask. Em seguida, GetUrlContentLengthAsync deseja calcular e retornar o comprimento da cadeia de caracteres baixada, mas o método não poderá calcular o valor enquanto o método tiver a cadeia de caracteres.GetUrlContentLengthAsync next wants to calculate and return the length of the downloaded string, but the method can't calculate that value until the method has the string.

    Portanto, GetUrlContentLengthAsync usa um operador await para suspender seu andamento e para transferir o controle para o método que chamou GetUrlContentLengthAsync.Therefore, GetUrlContentLengthAsync uses an await operator to suspend its progress and to yield control to the method that called GetUrlContentLengthAsync. GetUrlContentLengthAsync retorna um Task<int> ao chamador.GetUrlContentLengthAsync returns a Task<int> to the caller. A tarefa representa uma promessa de produzir um resultado inteiro que é o comprimento da cadeia de caracteres baixada.The task represents a promise to produce an integer result that's the length of the downloaded string.

    Observação

    Se GetStringAsync (e, portanto, getStringTask) for concluído antes que GetUrlContentLengthAsync o aguarde, o controle permanecerá em GetUrlContentLengthAsync.If GetStringAsync (and therefore getStringTask) completes before GetUrlContentLengthAsync awaits it, control remains in GetUrlContentLengthAsync. A despesa de suspender e de retornar para GetUrlContentLengthAsync seria desperdiçada se o processo assíncrono getStringTask já tiver sido concluído e GetUrlContentLengthAsync não tiver que esperar pelo resultado final.The expense of suspending and then returning to GetUrlContentLengthAsync would be wasted if the called asynchronous process getStringTask has already completed and GetUrlContentLengthAsync doesn't have to wait for the final result.

    Dentro do método de chamada, o padrão de processamento continua.Inside the calling method the processing pattern continues. O chamador pode fazer outro trabalho que não dependa do resultado de GetUrlContentLengthAsync antes de aguardar o resultado, ou o chamador pode aguardar imediatamente.The caller might do other work that doesn't depend on the result from GetUrlContentLengthAsync before awaiting that result, or the caller might await immediately. O método de chamada está aguardando GetUrlContentLengthAsync e GetUrlContentLengthAsync está aguardando GetStringAsync .The calling method is waiting for GetUrlContentLengthAsync, and GetUrlContentLengthAsync is waiting for GetStringAsync.

  7. GetStringAsync completa e produz um resultado de cadeia de caracteres.GetStringAsync completes and produces a string result. O resultado da cadeia de caracteres não é retornado pela chamada para GetStringAsync da maneira que você poderia esperar.The string result isn't returned by the call to GetStringAsync in the way that you might expect. (Lembre-se que o método já retornou uma tarefa na etapa 3.) Em vez disso, o resultado da cadeia de caracteres é armazenado na tarefa que representa a conclusão do método, getStringTask.(Remember that the method already returned a task in step 3.) Instead, the string result is stored in the task that represents the completion of the method, getStringTask. O operador await recupera o resultado de getStringTask.The await operator retrieves the result from getStringTask. A instrução de atribuição atribui o resultado retornado a contents.The assignment statement assigns the retrieved result to contents.

  8. Quando GetUrlContentLengthAsync tem o resultado da cadeia de caracteres, o método pode calcular o comprimento da cadeia de caracteres.When GetUrlContentLengthAsync has the string result, the method can calculate the length of the string. Em seguida, o trabalho de GetUrlContentLengthAsync também é concluído e o manipulador de eventos de espera poderá retomar.Then the work of GetUrlContentLengthAsync is also complete, and the waiting event handler can resume. No exemplo completo no final do tópico, é possível confirmar que o manipulador de eventos recuperou e imprimiu o valor do comprimento do resultado.In the full example at the end of the topic, you can confirm that the event handler retrieves and prints the value of the length result. Se você não tiver experiência em programação assíncrona, considere por um minuto a diferença entre o comportamento síncrono e o assíncrono.If you are new to asynchronous programming, take a minute to consider the difference between synchronous and asynchronous behavior. Um método síncrono retorna quando seu trabalho é concluído (etapa 5), mas um método assíncrono retorna um valor de tarefa quando seu trabalho está suspenso (etapas 3 e 6).A synchronous method returns when its work is complete (step 5), but an async method returns a task value when its work is suspended (steps 3 and 6). Quando o método assíncrono eventualmente concluir seu trabalho, a tarefa será marcada como concluída e o resultado, se houver, será armazenado na tarefa.When the async method eventually completes its work, the task is marked as completed and the result, if any, is stored in the task.

Métodos assíncronos de APIAPI async methods

Você pode estar curioso para saber onde encontrar métodos como GetStringAsync que oferecem suporte à programação assíncrona.You might be wondering where to find methods such as GetStringAsync that support async programming. .NET Framework 4,5 ou superior e o .NET Core contêm muitos membros que funcionam com o async e o await ..NET Framework 4.5 or higher and .NET Core contain many members that work with async and await. Você pode reconhecê-los pelo sufixo "Async" que é anexado ao nome do membro e por seu tipo de retorno de Task ou Task<TResult> .You can recognize them by the "Async" suffix that's appended to the member name, and by their return type of Task or Task<TResult>. Por exemplo, a classe System.IO.Stream contém métodos como CopyToAsync, ReadAsync e WriteAsync, juntamente com os métodos síncronos CopyTo, Read e Write.For example, the System.IO.Stream class contains methods such as CopyToAsync, ReadAsync, and WriteAsync alongside the synchronous methods CopyTo, Read, and Write.

O Windows Runtime também contém vários métodos que você pode usar com async e await em aplicativos do Windows.The Windows Runtime also contains many methods that you can use with async and await in Windows apps. Para obter mais informações, veja Threading e programação assíncrona para o desenvolvimento da UWP e Programação assíncrona (aplicativos da Windows Store) e Início Rápido: chamando APIs assíncronas em C# ou Visual Basic se você usa versões anteriores do Windows Runtime.For more information, see Threading and async programming for UWP development, and Asynchronous programming (Windows Store apps) and Quickstart: Calling asynchronous APIs in C# or Visual Basic if you use earlier versions of the Windows Runtime.

ThreadsThreads

Os métodos assíncronos destinam-se a ser operações não causadoras de bloqueios.Async methods are intended to be non-blocking operations. Uma await expressão em um método assíncrono não bloqueia o thread atual enquanto a tarefa esperada está em execução.An await expression in an async method doesn't block the current thread while the awaited task is running. Em vez disso, a expressão anterior assina o restante do método como uma continuação e retorna o controle para o chamador do método assíncrono.Instead, the expression signs up the rest of the method as a continuation and returns control to the caller of the async method.

As palavras-chave async e await não fazem com que threads adicionais sejam criados.The async and await keywords don't cause additional threads to be created. Os métodos assíncronos não exigem multithreading, pois um método assíncrono não executa em seu próprio thread.Async methods don't require multithreading because an async method doesn't run on its own thread. O método é executado no contexto de sincronização atual e usa tempo no thread somente quando o método está ativo.The method runs on the current synchronization context and uses time on the thread only when the method is active. É possível usar Task.Run para mover o trabalho de CPU associado a um thread em segundo plano, mas um thread em segundo plano não ajuda com um processo que está apenas aguardando que os resultados tornem-se disponíveis.You can use Task.Run to move CPU-bound work to a background thread, but a background thread doesn't help with a process that's just waiting for results to become available.

A abordagem baseada em async para a programação assíncrona é preferível às abordagens existentes em quase todos os casos.The async-based approach to asynchronous programming is preferable to existing approaches in almost every case. Essa abordagem é especialmente mais eficiente do que a classe BackgroundWorker para operações de entrada e saída, porque o código é mais simples e você não precisa se proteger contra condições de corrida.In particular, this approach is better than the BackgroundWorker class for I/O-bound operations because the code is simpler and you don't have to guard against race conditions. Em combinação com o Task.Run método, a programação assíncrona é melhor do que BackgroundWorker para operações associadas à CPU porque a programação assíncrona separa os detalhes de coordenação da execução do código do trabalho que Task.Run transfere para o pool de threads.In combination with the Task.Run method, async programming is better than BackgroundWorker for CPU-bound operations because async programming separates the coordination details of running your code from the work that Task.Run transfers to the thread pool.

Async e Awaitasync and await

Se você especificar que um método é assíncrono usando um modificador async, você habilitará os dois recursos a seguir.If you specify that a method is an async method by using the async modifier, you enable the following two capabilities.

  • O método assíncrono marcado pode usar await para designar pontos de suspensão.The marked async method can use await to designate suspension points. O operador await informa ao compilador que o método assíncrono não poderá continuar além daquele ponto até que o processo assíncrono aguardado seja concluído.The await operator tells the compiler that the async method can't continue past that point until the awaited asynchronous process is complete. Enquanto isso, o controle retorna para o chamador do método assíncrono.In the meantime, control returns to the caller of the async method.

    A suspensão de um método assíncrono em uma await expressão não constitui uma saída do método e os finally blocos não são executados.The suspension of an async method at an await expression doesn't constitute an exit from the method, and finally blocks don't run.

  • O método assíncrono marcado pode ele próprio ser aguardado por métodos que o chamam.The marked async method can itself be awaited by methods that call it.

Um método assíncrono normalmente contém uma ou mais ocorrências de um await operador, mas a ausência de await expressões não causa um erro de compilador.An async method typically contains one or more occurrences of an await operator, but the absence of await expressions doesn't cause a compiler error. Se um método assíncrono não usar um await operador para marcar um ponto de suspensão, o método será executado como um método síncrono, apesar do async modificador.If an async method doesn't use an await operator to mark a suspension point, the method executes as a synchronous method does, despite the async modifier. O compilador emite um aviso para esses métodos.The compiler issues a warning for such methods.

async e await são palavras-chave contextuais.async and await are contextual keywords. Para obter mais informações e exemplos, consulte os seguintes tópicos:For more information and examples, see the following topics:

Tipos de retorno e parâmetrosReturn types and parameters

Um método assíncrono normalmente retorna Task ou Task<TResult>.An async method typically returns a Task or a Task<TResult>. Dentro de um método assíncrono, um operador await é aplicado a uma tarefa que é retornada de uma chamada para outro método assíncrono.Inside an async method, an await operator is applied to a task that's returned from a call to another async method.

Você especifica Task<TResult> como o tipo de retorno se o método contiver uma return instrução que especifica um operando do tipo TResult .You specify Task<TResult> as the return type if the method contains a return statement that specifies an operand of type TResult.

Você usará Task como o tipo de retorno se o método não tiver nenhuma instrução return ou se tiver uma instrução return que não retorna um operando.You use Task as the return type if the method has no return statement or has a return statement that doesn't return an operand.

Começando com C# 7.0, também será possível especificar qualquer outro tipo de retorno, desde que o tipo inclua um método GetAwaiter.Starting with C# 7.0, you can also specify any other return type, provided that the type includes a GetAwaiter method. ValueTask<TResult> é um exemplo de tal tipo.ValueTask<TResult> is an example of such a type. Ele está disponível no pacote NuGet System.Threading.Tasks.Extension.It is available in the System.Threading.Tasks.Extension NuGet package.

O exemplo a seguir mostra como você declara e chama um método que retorna um Task<TResult> ou um Task :The following example shows how you declare and call a method that returns a Task<TResult> or a Task:

async Task<int> GetTaskOfTResultAsync()
{
    int hours = 0;
    await Task.Delay(0);

    return hours;
}


Task<int> returnedTaskTResult = GetTaskOfTResultAsync();
int intResult = await returnedTaskTResult;
// Single line
// int intResult = await GetTaskOfTResultAsync();

async Task GetTaskAsync()
{
    await Task.Delay(0);
    // No return statement needed
}

Task returnedTask = GetTaskAsync();
await returnedTask;
// Single line
await GetTaskAsync();

Cada tarefa retornada representa um trabalho em andamento.Each returned task represents ongoing work. Uma tarefa encapsula informações sobre o estado do processo assíncrono e, consequentemente, o resultado final do processo ou a exceção que o processo apresenta quando não é bem-sucedido.A task encapsulates information about the state of the asynchronous process and, eventually, either the final result from the process or the exception that the process raises if it doesn't succeed.

Um método assíncrono também pode ter um tipo de retorno void.An async method can also have a void return type. Esse tipo de retorno é usado principalmente para definir manipuladores de eventos, onde o tipo de retorno void é necessário.This return type is used primarily to define event handlers, where a void return type is required. Os manipuladores de eventos assíncronos geralmente servem como o ponto de partida para programas assíncronos.Async event handlers often serve as the starting point for async programs.

Um método assíncrono que tem um void tipo de retorno não pode ser aguardado, e o chamador de um método de retorno nulo não pode capturar nenhuma exceção que o método gera.An async method that has a void return type can't be awaited, and the caller of a void-returning method can't catch any exceptions that the method throws.

O método não pode declarar nenhum parâmetro in, ref ou out, mas pode chamar métodos com tais parâmetros.An async method can't declare in, ref or out parameters, but the method can call methods that have such parameters. Da mesma forma, um método assíncrono não pode retornar um valor por referência, embora possa chamar métodos com valores retornados ref.Similarly, an async method can't return a value by reference, although it can call methods with ref return values.

Para obter mais informações e exemplos, consulte tipos de retorno assíncrono (C#).For more information and examples, see Async return types (C#). Para obter mais informações sobre como capturar exceções nos métodos assíncronos, consulte try-catch.For more information about how to catch exceptions in async methods, see try-catch.

As APIs assíncronas na programação do Windows Runtime têm um dos seguintes tipos de retorno, que são semelhantes às tarefas:Asynchronous APIs in Windows Runtime programming have one of the following return types, which are similar to tasks:

Convenção de nomenclaturaNaming convention

Por convenção, os métodos que retornam tipos comumente awaitable (por exemplo,,,, Task Task<T> ValueTask ValueTask<T> ) devem ter nomes que terminem com "Async".By convention, methods that return commonly awaitable types (for example, Task, Task<T>, ValueTask, ValueTask<T>) should have names that end with "Async". Os métodos que iniciam uma operação assíncrona, mas não retornam um tipo aguardável não devem ter nomes que terminam com "Async", mas podem começar com "Begin", "Start" ou algum outro verbo que indique que esse método não retorna nem gera o resultado da operação.Methods that start an asynchronous operation but do not return an awaitable type should not have names that end with "Async", but may start with "Begin", "Start", or some other verb to suggest this method does not return or throw the result of the operation.

É possível ignorar a convenção quando um evento, uma classe base ou um contrato de interface sugere um nome diferente.You can ignore the convention where an event, base class, or interface contract suggests a different name. Por exemplo, você não deve renomear manipuladores de eventos comuns, como OnButtonClick .For example, you shouldn't rename common event handlers, such as OnButtonClick.

TítuloTitle DescriçãoDescription AmostraSample
Como fazer várias solicitações da Web em paralelo usando Async e Await (C#)How to make multiple web requests in parallel by using async and await (C#) Demonstra como iniciar várias tarefas ao mesmo tempo.Demonstrates how to start several tasks at the same time. Exemplo de assincronia: fazer várias solicitações da Web paralelamenteAsync Sample: Make Multiple Web Requests in Parallel
Tipos de retorno assíncrono (C#)Async return types (C#) Ilustra os tipos que os métodos assíncronos podem retornar e explica quando cada tipo é apropriado.Illustrates the types that async methods can return, and explains when each type is appropriate.
Cancelar tarefas com um token de cancelamento como um mecanismo de sinalização.Cancel tasks with a cancellation token as a signaling mechanism. Mostra como adicionar a seguinte funcionalidade à sua solução assíncrona:Shows how to add the following functionality to your async solution:

- Cancelar uma lista de tarefas (C#)- Cancel a list of tasks (C#)
- Cancelar tarefas após um período de tempo (C#)- Cancel tasks after a period of time (C#)
- Processar tarefa assíncrona como concluída (C#)- Process asynchronous task as they complete (C#)
Usando Async para acesso a arquivos (C#)Using async for file access (C#) Lista e demonstra as vantagens de usar async e await para acessar arquivos.Lists and demonstrates the benefits of using async and await to access files.
Padrão assíncrono baseado em tarefa (toque)Task-based asynchronous pattern (TAP) Descreve um padrão assíncrono, o padrão é baseado nos Task tipos e Task<TResult> .Describes an asynchronous pattern, the pattern is based on the Task and Task<TResult> types.
Vídeos sobre assincronia no Channel 9Async Videos on Channel 9 Fornece links para uma variedade de vídeos sobre programação assíncrona.Provides links to a variety of videos about async programming.

Confira tambémSee also