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

Você pode evitar afunilamentos de desempenho e aprimorar a resposta total do aplicativo através de programação assíncrona.No entanto, as técnicas tradicionais para escrever aplicativos assíncronos podem ser complicadas, tornando difícil escrever os, depurar e manter.

Visual Studio 2012 apresenta uma abordagem simplificada, a programação de async, que aproveita suporte assíncrono em .NET Framework 4.5 e em Tempo de Execução do Windows.O compilador faz o trabalho difícil que o desenvolvedor usado para fazer seu aplicativo, e mantém uma estrutura lógica que se assemelha ao código síncrona.Como resultado, você obtém todas as vantagens de programação assíncrona com uma fração de esforço.

Este tópico contém as seções a seguir.

  • Async melhora a resposta
  • Os métodos de Async são mais fáceis para escrever
  • O que acontece em um método de Async
  • Métodos API Async
  • Segmentos
  • Async e espera
  • Tipos de retorno e parâmetros
  • Convenção de nomenclatura
  • Tópicos relacionados
  • Exemplo Completo
  • Tópicos relacionados

Este tópico fornece uma visão geral sobre quando e como usar a programação de async e incluir links para oferecer suporte aos tópicos que contêm detalhes e exemplos.

Async melhora a resposta

Asynchrony é essencial para as atividades que estão bloqueando possivelmente, como quando seu aplicativo acessa a Web.Acessar um recurso a Web é às vezes lento ou tarde.Se esse atividade é bloqueada dentro de um processo síncrono, o aplicativo inteiro deve esperar.Em um processo assíncrono, o aplicativo pode continuar com outro trabalho que não depende do recurso Web até que potencialmente bloquear a tarefa termina.

A tabela a seguir mostra as áreas onde típicas a programação assíncrona melhora a resposta.APIs listados de .NET Framework 4.5 e Tempo de Execução do Windows contêm os métodos que oferecem suporte a programação de async.

A área de aplicativo

APIs de suporte que contêm métodos de async

Acesso da Web

HttpClient, SyndicationClient

Trabalhar com arquivos

StorageFile, StreamWriter, StreamReader, XmlReader

Trabalhar com imagens

MediaCaptureBitmapEncoder, BitmapDecoder

Programação WCF

Síncrona e operações assíncronas

Trabalhar com soquetes

Socket

Asynchrony prova especialmente o artigo de valor para aplicativos que acessam o encadeamento de interface de usuário como quaisquer atividades Interface de usuário relacionados compartilha geralmente um segmento.Se qualquer processo é bloqueado em um aplicativo síncrono, todos são bloqueados.Seu aplicativo para responder de, e você pode concluir que falhou quando estiver aguardando apenas em vez disso.

Quando você usa métodos assíncronos, o aplicativo continuará a responder a interface do usuário.Você pode redimensionar ou minimizar-lo uma janela, por exemplo, ou pode fechar o aplicativo se você não desejar esperar ele concluir.

A abordagem async- base adiciona o equivalente de uma transmissão automático à lista de opções da qual você pode escolher para criar operações assíncronas.Ou seja, você obtém todos os benefícios de programação assíncrona tradicional mas com muito menos esforço de desenvolvimento.

Os métodos de Async são mais fáceis para escrever

As palavras-chave de Async e de Espere no Visual Basic e as palavras-chave de async e de espere em C# é o coração de programação de async.Usando esses dois palavra-chave, você pode usar recursos do.NET Framework ou em Tempo de Execução do Windows para criar quase tão facilmente um método assíncrono como você cria um método síncrona.Os métodos assíncronos que você define usando o async e espera são chamados métodos de async.

O exemplo a seguir mostra um método de async.Quase tudo no código deve ser completamente familiar para você.Os comentários chamam os recursos que você adiciona para criar o asynchrony.

Você pode localizar o arquivo de exemplo completo no final deste tópico, e você pode baixar o exemplo de Exemplo de Async: O exemplo “de programação assíncrona com Async e espera”.

' Three things to note in the signature:
'  - The method has an Async modifier. 
'  - The return type is Task or Task(Of T). (See "Return Types" section.)
'    Here, it is Task(Of Integer) because the return statement returns an integer.
'  - The method name ends in "Async."
Async Function AccessTheWebAsync() As Task(Of Integer)

    ' You need to add a reference to System.Net.Http to declare client.
    Dim client As HttpClient = New HttpClient()

    ' GetStringAsync returns a Task(Of String). That means that when you await the
    ' task you'll get a string (urlContents).
    Dim getStringTask As Task(Of String) = client.GetStringAsync("https://msdn.microsoft.com")


    ' You can do work here that doesn't rely on the string from GetStringAsync.
    DoIndependentWork()

    ' The Await operator suspends AccessTheWebAsync.
    '  - AccessTheWebAsync can't continue until getStringTask is complete.
    '  - Meanwhile, control returns to the caller of AccessTheWebAsync.
    '  - Control resumes here when getStringTask is complete. 
    '  - The Await operator then retrieves the string result from getStringTask.
    Dim urlContents As String = Await getStringTask

    ' The return statement specifies an integer result.
    ' Any methods that are awaiting AccessTheWebAsync retrieve the length value.
    Return urlContents.Length
End Function
// Three things to note in the signature:
//  - The method has an async modifier. 
//  - The return type is Task or Task<T>. (See "Return Types" section.)
//    Here, it is Task<int> because the return statement returns an integer.
//  - The method name ends in "Async."
async Task<int> AccessTheWebAsync()
{ 
    // You need to add a reference to System.Net.Http to declare client.
    HttpClient client = new HttpClient();

    // GetStringAsync returns a Task<string>. That means that when you await the
    // task you'll get a string (urlContents).
    Task<string> getStringTask = client.GetStringAsync("https://msdn.microsoft.com");

    // You can do work here that doesn't rely on the string from GetStringAsync.
    DoIndependentWork();

    // The await operator suspends AccessTheWebAsync.
    //  - AccessTheWebAsync can't continue until getStringTask is complete.
    //  - Meanwhile, control returns to the caller of AccessTheWebAsync.
    //  - Control resumes here when getStringTask is complete. 
    //  - The await operator then retrieves the string result from getStringTask.
    string urlContents = await getStringTask;

    // The return statement specifies an integer result.
    // Any methods that are awaiting AccessTheWebAsync retrieve the length value.
    return urlContents.Length;
}

Se AccessTheWebAsync não tem nenhum trabalho que pode fazer entre chamar GetStringAsync e aguardar sua conclusão, você pode simplificar o seu código chamando e esperando na única declaração.

Dim urlContents As String = Await client.GetStringAsync()
string urlContents = await client.GetStringAsync();

As seguintes características resumem o que faz ao exemplo anterior um método de async.

  • A assinatura do método inclui um modificador de Async ou de async .

  • O nome de um método de async, por convenção, termina com um sufixo de “Async”.

  • O tipo de retorno é um dos seguintes tipos:

    • Task<TResult> se o método tem uma instrução return em que o operando tem o tipo TResult.

    • Task se o método não tem nenhuma instrução return não tem uma instrução de retorno sem o operando.

    • Vácuo ( Sub no Visual Basic) se você estiver escrevendo um manipulador de eventos de async.

    Para obter mais informações, consulte “tipos de retorno e parâmetros” posteriormente neste tópico.

  • O método geralmente inclui pelo menos um espera a expressão, a marca de um ponto onde o método não possa continuar até que a operação assíncrona esperada seja concluída.Entretanto, o método é suspensa, e retorna o controle para o chamador do método.A próxima seção deste tópico ilustra o que acontece no ponto de suspensão.

Em métodos de async, você usa as palavras-chave e tipos fornecidos para indicar qual você deseja fazer, e o compilador faz o restante, incluindo mantendo rastro do que acontece quando o controle retorna para um ponto de espera em um método suspenso.Alguns processos da rotina, como loop e manipulação de exceção, podem ser difíceis de manipular no código assíncrono tradicional.Em um método de async, você escreve para esses elementos exatamente como você faria em uma solução síncrono, e o problema foi resolvido.

Para obter mais informações sobre asynchrony em versões anteriores do.NET Framework, consulte A TPL e tradicionais.NET programação assíncrona.

O que acontece em um método de Async

A coisa mais importante compreender na programação assíncrona é como o fluxo de controle se move o método para o método.O diagrama a seguir conduz você com o processo.

Rastrear um programa assíncrono

Números no diagrama correspondem às seguintes etapas.

  1. Um manipulador de eventos e espera chama o método de async de AccessTheWebAsync .

  2. AccessTheWebAsync cria uma instância de HttpClient e chama o método assíncrona de GetStringAsync para baixar o conteúdo de um site como uma cadeia de caracteres.

  3. Algo acontece em GetStringAsync que suspende o andamento.Talvez deve aguardar um site para baixar ou alguma outra atividade de bloqueio.Para evitar bloqueio recursos, controle para o chamador, às AccessTheWebAsyncde GetStringAsync .

    GetStringAsync retorna Task<TResult> onde TResult é uma cadeia de caracteres, e AccessTheWebAsync a tarefa atribui à variável de getStringTask .A tarefa representa o processo em progresso para a chamada a GetStringAsync, com um comprometida para produzir um valor de cadeia de caracteres quando o trabalho real é concluída.

  4. Porque getStringTask ainda não foi esperado, AccessTheWebAsync pode continuar com outro trabalho que não depende do resultado final de GetStringAsync.O trabalho é representado por uma chamada para o método DoIndependentWorksíncrona.

  5. DoIndependentWork é um método síncrono que faz o trabalho e retorna ao chamador.

  6. AccessTheWebAsync executar fora de trabalho que pode fazer sem um resultado de getStringTask.AccessTheWebAsync após calcular e deseja retornar o comprimento da cadeia de caracteres baixada, mas o método não pode calcular o valor até que o método tenha a cadeia de caracteres.

    Como consequência, AccessTheWebAsync usa um operador de espera para suspender o andamento e para produzir o controle para o método que chamou AccessTheWebAsync.AccessTheWebAsync retorna Task(Of Integer) ou Task<int> para o chamador.A tarefa representa uma promessa de produzir um resultado inteiro que é o comprimento da cadeia de caracteres baixada.

    ObservaçãoObservação

    Se GetStringAsync (e) como consequência getStringTaskestiverem concluídas antes que AccessTheWebAsync espera, o controle permanecerá AccessTheWebAsyncem.O custo de suspensão e em seguida de retornar a AccessTheWebAsync seria desperdiçada se o processo assíncrono chamadogetStringTask() já tiver concluído e AccessTheWebSync não precisará esperar o resultado final.

    Dentro do chamador (manipulador de eventos neste exemplo), o processo é repetido.O chamador pode fazer outro trabalho que não depende do resultado de AccessTheWebAsync antes de espera esse resultado, ou o chamador pode esperar imediatamente.Quando o manipulador de eventos atinge uma expressão de espera, o aplicativo enfoca a conclusão de GetStringAsync.O manipulador de eventos está aguardando AccessTheWebAsync, e AccessTheWebAsync está aguardando GetStringAsync.

  7. GetStringAsync completa e produz um resultado de cadeia de caracteres.O resultado da cadeia de caracteres não é retornado pela chamada a GetStringAsync da maneira que você esperava.(Lembre-se de que o método retornou já 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.O operador de espera retorna o resultado de getStringTask.A instrução de atribuição atribui o resultado retornado pela urlContents.

  8. Quando AccessTheWebAsync tem o resultado da cadeia de caracteres, o método pode calcular o comprimento da cadeia de caracteres.O trabalho de AccessTheWebAsync também está completo, e o manipulador de eventos de espera pode continuar.No exemplo completo no final do tópico, você pode confirmar que o manipulador de eventos recupera e imprime o valor do resultado de comprimento.

Se você for novo para programação assíncrona, recebe um minuto para ver a diferença entre o comportamento síncrono e assíncrono.Um síncrono método retorna quando seu trabalho está cheio (etapa 5), mas um método de async retorna um valor de tarefa quando seu trabalho é suspenso (etapas 3 e 6).Quando o método de async termina em seu trabalho, a tarefa é marcada como completo e, se houver, o resultado é armazenado na tarefa.

Para obter mais informações sobre o fluxo de controle, consulte Fluxo de controle em programas Async (C# e Visual Basic).

Métodos API Async

Você pode imaginar onde localizar os métodos como GetStringAsync que oferecem suporte a programação de async..NET Framework 4.5 contém vários membros que funcionam com async e espera.Você pode identificar esses membros pelo sufixo de “Async” que é anexado ao nome do membro e a um tipo de retorno de Task ou de Task<TResult>.Por exemplo, a classe de System.IO.Stream contém métodos como CopyToAsync, ReadAsync, e WriteAsync ao lado dos métodos síncronos CopyTo, Read, e Write.

Tempo de Execução do Windows também contém vários métodos que você pode usar com async e esperar em aplicativos de Windows Store .Métodos de para mais informações e um exemplo, consulte Quickstart: usando o operador de espera para programação assíncronaProgramação assíncrona (aplicativos da Windows Store), e WhenAny: ponte entre o .NET Framework e o Tempo de Execução do Windows (C# e Visual Basic).

Segmentos

Os métodos de Async pretendem ser operações de não bloqueio.Uma expressão de espera em um método de async não bloqueia o segmento atual quando a tarefa deve executar.Em vez disso, a expressão anterior assina o restante do método como uma continuação e o retorna o controle para o chamador do método de async.

O async e espera palavra-chave não faz com que os segmentos adicionais a serem criados.Os métodos de Async não exigem multithreading como um método de async não executa em seu próprio thread.O método é executado no contexto de sincronização e tempo atuais dos usos no segmento somente quando o método está ativo.Você pode usar Task.Run para mover o trabalho de CPU associado a uma thread em segundo plano, mas um segmento de plano de fundo não ajuda com um processo que está esperando apenas resultados para estejam disponíveis.

A abordagem async- com base na programação assíncrona é preferível as abordagens existentes em quase todos os casos.Em particular, essa abordagem é melhor do que BackgroundWorker para operações de IO- limite porque o código é mais simples e você não tem que se proteger contra as condições de corrida.Em combinação com Task.Run, a programação de async é melhor do que BackgroundWorker para operações de CPU limite porque a programação de async separa os detalhes de coordenação de executar o código de trabalho que Task.Run transfere o threadpool.

Async e espera

Se você especificar que um método é um método de async usando um modificador de Async ou de async , você ativar os dois seguintes recursos.

  • O método marcado de async pode usar Espere ou espere para designar pontos de suspensão.O operador de espera informa o compilador que o método de async não pode continuar o passado apontando até que o processo assíncrono esperado seja concluída.Entretanto, o controle retorna para o chamador do método de async.

    A suspensão de um método de async em uma expressão de espera não constitui uma saída de método, e os blocos de finally não são executadas.

  • O método de async próprio marcado pode esperar por métodos que chamam o.

Um método de async geralmente contém uma ou mais ocorrências de um operador de espera, mas a ausência de espera expressões não causa um erro do compilador.Se um método de async não usa um operador de espera para marcar um ponto de suspensão, o método é executado como um método síncrono faz, independentemente do modificador de async.O compilador emite um aviso para esses métodos.

Async, async, Await, e await são palavras-chave contextuais.Para mais informações e exemplos, consulte os seguintes tópicos:

Tipos de retorno e parâmetros

No .NET Framework que o programa, um método de async normalmente retorna Task ou Task<TResult>.Dentro de um método de async, um operador de espera é aplicado a uma tarefa que é retornada de uma chamada para outro método de async.

Você especifica Task<TResult> como o tipo de retorno se o método contém uma declaração de Retorno (Visual Basic) ou de retorno (C#) que especifica um operando do tipo TResult.

Você usa Task como o tipo de retorno se o método não tem nenhuma instrução return não tem uma instrução de retorno que não retorna um operando.

O exemplo a seguir mostra como você declara e chama um método que retorna Task<TResult> ou Task.

' Signature specifies Task(Of Integer)
Async Function TaskOfTResult_MethodAsync() As Task(Of Integer)

    Dim hours As Integer
    ' . . .
    ' Return statement specifies an integer result.
    Return hours
End Function

' Calls to TaskOfTResult_MethodAsync
Dim returnedTaskTResult As Task(Of Integer) = TaskOfTResult_MethodAsync()
Dim intResult As Integer = Await returnedTaskTResult
' or, in a single statement
Dim intResult As Integer = Await TaskOfTResult_MethodAsync()


' Signature specifies Task
Async Function Task_MethodAsync() As Task

    ' . . .
    ' The method has no return statement.
End Function

' Calls to Task_MethodAsync
Task returnedTask = Task_MethodAsync()
Await returnedTask
' or, in a single statement
Await Task_MethodAsync()
// Signature specifies Task<TResult>
async Task<int> TaskOfTResult_MethodAsync()
{
    int hours;
    // . . .
    // Return statement specifies an integer result.
    return hours;
}

// Calls to TaskOfTResult_MethodAsync
Task<int> returnedTaskTResult = TaskOfTResult_MethodAsync();
int intResult = await returnedTaskTResult;
// or, in a single statement
int intResult = await TaskOfTResult_MethodAsync();


// Signature specifies Task
async Task Task_MethodAsync()
{
    // . . .
    // The method has no return statement.  
}

// Calls to Task_MethodAsync
Task returnedTask = Task_MethodAsync();
await returnedTask;
// or, in a single statement
await Task_MethodAsync();

Cada tarefa retornado representa trabalho contínuo.Uma tarefa encapsula informações sobre o estado do processo assíncrono e, se houver, o resultado final do processo ou a exceção que o gera do processo se não tiver êxito.

Um método de async também pode ser um método de Sub (Visual Basic) ou ter um tipo de retorno de void (C#).Esse tipo de retorno é basicamente usado para definir os manipuladores de eventos, onde um tipo de retorno de void é necessário.Os manipuladores de eventos de Async geralmente servem como ponto de partida para programas de async.

Um método de async que é um procedimento de Sub ou que tenha um tipo de retorno de void não pode ser esperado, e o chamador de um método vago- retornando não podem nenhuma capturar exceções que o gera o método.

Um método de async não pode declarar parâmetros de ByRef em Visual Basic ou em referência ou parâmetros de out em C#, mas o método pode chamar métodos que têm esses parâmetros.

Para mais informações e exemplos, consulte Tipos de retorno de Async (C# e Visual Basic).Para obter mais informações sobre como capturar exceções em métodos de async, consulte try-catch (referência de C#) ou Try...Catch...Instrução finally (Visual Basic).

APIs assíncronos na programação de Tempo de Execução do Windows têm um dos seguintes tipos de retorno, que são semelhantes às tarefas:

Para mais informações e um exemplo, consulte Quickstart: usando o operador de espera para programação assíncrona.

Convenção de nomenclatura

Por convenção, você acrescenta “Async” os nomes dos métodos que têm um modificador de Async ou de async .

Você pode ignorar a convenção onde um evento, uma classe base, ou um contrato de interface sugerem um nome diferente.Por exemplo, você não deve renomear manipuladores de eventos comum, como Button1_Click.

Tópicos relacionados

Nome

Descrição

Exemplo

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

Mostra como converter uma solução síncrono WPF a uma solução assíncrono WPF.O aplicativo baixa uma série de sites.

Exemplo de Async: Acessando a explicação passo a passo da Web (C# e Visual Basic)

Como: estende o passo a passo usando Task.WhenAll (C# e Visual Basic)

Adiciona Task.WhenAll a passo a passo anterior.O uso de WhenAll começa todos os downloads ao mesmo tempo.

Como: fazer solicitações da Web de vários em paralelo (C# e Visual Basic)

Demonstra como iniciar várias tarefas ao mesmo tempo.

Exemplo de Async: Faça várias solicitações da Web paralelamente (C# e Visual Basic)

Tipos de retorno de Async (C# e Visual Basic)

Ilustra os tipos que os métodos de async podem retornar e explica quando cada tipo apropriado.

Fluxo de controle em programas Async (C# e Visual Basic)

Os detalhes rastreamentos no fluxo de controle com uma sucessão de espera expressões em um programa assíncrono.

Exemplo de Async: Fluxo de controle em programas de Async (C# e Visual Basic)

Ajustando seu aplicativo Async (C# e Visual Basic)

Mostra como adicionar a seguinte funcionalidade à sua solução de async:

Exemplo de Async: Ajustando o aplicativo (C# e Visual Basic)

Tratando a reentrada em aplicativos assíncronos (C# e Visual Basic)

Mostra como manipular o caso em que uma operação assíncrona ativa é reiniciado quando executar.

WhenAny: ponte entre o .NET Framework e o Tempo de Execução do Windows (C# e Visual Basic)

Mostra como construir uma ponte entre sobre a tarefa no .NET Framework e o IAsyncOperations em Tempo de Execução do Windows para que você possa usar o WhenAny com um método de Tempo de Execução do Windows .

Exemplo de Async: Construção de uma ponte entre sobre .NET e Tempo de Execução do Windows (AsTask e WhenAny)

Cancelamento: ponte entre o .NET Framework e o Tempo de Execução do Windows (C# e Visual Basic)

Mostra como construir uma ponte entre sobre a tarefa no .NET Framework e o IAsyncOperations em Tempo de Execução do Windows para que você possa usar CancellationTokenSource com um método de Tempo de Execução do Windows .

Exemplo de Async: Construção de uma ponte entre sobre .NET e Tempo de Execução do Windows (& AsTask cancelar)

Usando o Async para acessar arquivos (C# e Visual Basic)

As listas e demonstram as vantagens de usar o async e esperam-nos para acessar arquivos.

Passo a passo: Usando o depurador com métodos assíncronos

Demonstra o fluxo de controle em uma instrução de espera, e demonstra o comportamento de Depuração Completa, de Depuração Parcial, e comandos de Depuração Circular em métodos de async.

Padrão assíncrono baseado chave (TORNEIRA)

Descreve um novo padrão para asynchrony no .NET Framework.O padrão é baseado nos tipos de Task e de Task<TResult> .

Quickstart: Chamando APIs assíncrono em C# ou Visual Basic

Mostra como usar o async e aguardar em um aplicativo de Windows Store .

Programação assíncrona (aplicativos da Windows Store)

Fornece uma visão geral de programação assíncrona em Tempo de Execução do Windows.

Exibe de Async no canal 9

Fornece links para uma variedade de exibe sobre programação de async.

Exemplo Completo

O código a seguir é o arquivo de MainWindow.xaml.vb ou MainWindow.xaml.cs do aplicativo Windows Presentation Foundation (WPF) que este tópico discute.Você pode baixar o exemplo de Exemplo de Async: O exemplo “de programação assíncrona com Async e espera”.

' Add an Imports statement and a reference for System.Net.Http
Imports System.Net.Http

Class MainWindow

    ' Mark the event handler with async so you can use Await in it.
    Private Async Sub StartButton_Click(sender As Object, e As RoutedEventArgs)

        ' Call and await separately.
        'Task<int> getLengthTask = AccessTheWebAsync();
        '' You can do independent work here.
        'int contentLength = await getLengthTask;

        Dim contentLength As Integer = Await AccessTheWebAsync()

        ResultsTextBox.Text &=
            String.Format(vbCrLf & "Length of the downloaded string: {0}." & vbCrLf, contentLength)
    End Sub


    ' Three things to note in the signature:
    '  - The method has an Async modifier. 
    '  - The return type is Task or Task(Of T). (See "Return Types" section.)
    '    Here, it is Task(Of Integer) because the return statement returns an integer.
    '  - The method name ends in "Async."
    Async Function AccessTheWebAsync() As Task(Of Integer)

        ' You need to add a reference to System.Net.Http to declare client.
        Dim client As HttpClient = New HttpClient()

        ' GetStringAsync returns a Task(Of String). That means that when you await the
        ' task you'll get a string (urlContents).
        Dim getStringTask As Task(Of String) = client.GetStringAsync("https://msdn.microsoft.com")


        ' You can do work here that doesn't rely on the string from GetStringAsync.
        DoIndependentWork()

        ' The Await operator suspends AccessTheWebAsync.
        '  - AccessTheWebAsync can't continue until getStringTask is complete.
        '  - Meanwhile, control returns to the caller of AccessTheWebAsync.
        '  - Control resumes here when getStringTask is complete. 
        '  - The Await operator then retrieves the string result from getStringTask.
        Dim urlContents As String = Await getStringTask

        ' The return statement specifies an integer result.
        ' Any methods that are awaiting AccessTheWebAsync retrieve the length value.
        Return urlContents.Length
    End Function


    Sub DoIndependentWork()
        ResultsTextBox.Text &= "Working . . . . . . ." & vbCrLf
    End Sub
End Class

' Sample Output:

' Working . . . . . . .

' Length of the downloaded string: 41763.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

// Add a using directive and a reference for System.Net.Http;
using System.Net.Http;

namespace AsyncFirstExample
{
    public partial class MainWindow : Window
    {
        // Mark the event handler with async so you can use await in it.
        private async void StartButton_Click(object sender, RoutedEventArgs e)
        {
            // Call and await separately.
            //Task<int> getLengthTask = AccessTheWebAsync();
            //// You can do independent work here.
            //int contentLength = await getLengthTask;

            int contentLength = await AccessTheWebAsync();

            resultsTextBox.Text +=
                String.Format("\r\nLength of the downloaded string: {0}.\r\n", contentLength);
        }


        // Three things to note in the signature:
        //  - The method has an async modifier. 
        //  - The return type is Task or Task<T>. (See "Return Types" section.)
        //    Here, it is Task<int> because the return statement returns an integer.
        //  - The method name ends in "Async."
        async Task<int> AccessTheWebAsync()
        { 
            // You need to add a reference to System.Net.Http to declare client.
            HttpClient client = new HttpClient();

            // GetStringAsync returns a Task<string>. That means that when you await the
            // task you'll get a string (urlContents).
            Task<string> getStringTask = client.GetStringAsync("https://msdn.microsoft.com");

            // You can do work here that doesn't rely on the string from GetStringAsync.
            DoIndependentWork();

            // The await operator suspends AccessTheWebAsync.
            //  - AccessTheWebAsync can't continue until getStringTask is complete.
            //  - Meanwhile, control returns to the caller of AccessTheWebAsync.
            //  - Control resumes here when getStringTask is complete. 
            //  - The await operator then retrieves the string result from getStringTask.
            string urlContents = await getStringTask;

            // The return statement specifies an integer result.
            // Any methods that are awaiting AccessTheWebAsync retrieve the length value.
            return urlContents.Length;
        }


        void DoIndependentWork()
        {
            resultsTextBox.Text += "Working . . . . . . .\r\n";
        }
    }
}

// Sample Output:

// Working . . . . . . .

// Length of the downloaded string: 41564.

Consulte também

Referência

Async (referência de C#)

aguardar (referência de C#)

Aguardar o operador (Visual Basic)

Async (Visual Basic)