Início rápido: chamando APIs assíncronas no Visual Basic ou C#

Applies to Windows and Windows Phone

O Tempo de Execução do Windows inclui muitas APIs assíncronas, para garantir que o seu aplicativo permaneça responsivo ao executar trabalhos que podem demorar muito tempo. Isso significa que o aplicativo não precisa aguardar a conclusão de operações grandes para continuar sua execução. Por exemplo, um aplicativo que baixa informações da Internet pode passar diversos segundos aguardando a chegada das informações. Se você usar um método síncrono para recuperar as informações, o aplicativo ficará bloqueado até que o método seja retornado. O aplicativo não responderá à interação do usuário e, como ele parecerá não responsivo, o usuário poderá ficar frustrado. Ao fornecer APIs assíncronas, o Tempo de Execução do Windows ajuda a garantir que seu aplicativo permaneça responsivo ao usuário quando estiver executando operações longas.

A maioria das APIs assíncronas do Tempo de Execução do Windows não possui equivalentes síncronos, por isso, você tem de saber como usá-las com C# ou Visual Basic em seu aplicativo do Tempo de Execução do Windows. Nós vamos mostrar como chamar as APIs assíncronas do Tempo de Execução do Windows.

Mapa: como este tópico está relacionado aos outros? Veja:

Pré-requisitos

Veja Criar seu primeiro aplicativo do Tempo de Execução do Windows em C# ou Visual Basic.

Usando APIs assíncronas

Por convenção, os métodos assíncronos recebem nomes que terminam em "Async". Você normalmente chama APIs assíncronas em resposta à ação de um usuário, como por exemplo, quando o usuário clica em um botão. Chamar um método assíncrono em um manipulador de eventos é uma das maneiras mais simples de usar APIs assíncronas. Aqui, usamos o operador await como exemplo.

Suponha que você tenha um aplicativo que lista os títulos das postagens de um blog de um determinado local. O aplicativo tem um Button em que o usuário clica para obter os títulos. Os títulos são exibidos em um TextBlock. Quando o usuário clica no botão, é importante que o aplicativo continue respondendo enquanto aguarda a informação do site do blog. Para garantir essa capacidade de resposta, o Tempo de Execução do Windows fornece um método assíncrono, o SyndicationClient.RetrieveFeedAsync, para baixar o feed.

O exemplo a seguir obtém as listas de postagens de um blog chamando o método assíncrono SyndicationClient.RetrieveFeedAsync. Esta é a maneira mais simples de chamar um método assíncrono.


// Put the keyword, async on the declaration of the event handler.
private async void Button_Click_1(object sender, RoutedEventArgs e)
{

    Windows.Web.Syndication.SyndicationClient client = new SyndicationClient();

    // Force the SyndicationClient to download the information.
    client.BypassCacheOnRetrieve = true;

    Uri feedUri
        = new Uri("http://windowsteamblog.com/windows/b/windowsexperience/atom.aspx");

    try
    {
        // Call SyndicationClient RetrieveFeedAsync to download the list of blog posts.
        SyndicationFeed feed = await client.RetrieveFeedAsync(feedUri);

        // The rest of this method executes after await RetrieveFeedAsync completes.
        rssOutput.Text = feed.Title.Text + Environment.NewLine;

        foreach (SyndicationItem item in feed.Items)
        {
            rssOutput.Text += item.Title.Text + ", " +
                             item.PublishedDate.ToString() + Environment.NewLine;
        }
    }
    catch (Exception ex)
    {
        // Log Error.
        rssOutput.Text =
            "I'm sorry, but I couldn't load the page," +
            " possibly due to network problems." +
            "Here's the error message I received: "
            + ex.ToString();
    }
}


Há algumas coisas importantes sobre este exemplo. Primeiro, a linha, SyndicationFeed feed = await client.RetrieveFeedAsync(feedUri) usa o operador await com a chamada no método assíncrono, RetrieveFeedAsync. Você pode pensar no operador await dizendo ao compilador que você está chamando um método assíncrono, o que faz com que o compilador faça um trabalho extra, para que você não precise fazê-lo. Em seguida, a declaração do manipulador de eventos inclui a palavra-chave async. Você deve incluir essa palavra-chave na declaração de método de qualquer método em que usar o operador await. Não há nada sobre a assinatura do manipulador de eventos Button.Click que exigiu a palavra-chave async; a palavra-chave async foi adicionada deliberadamente para que o compilador permitisse a chamada de métodos assíncronos do corpo desse manipulador. Para saber mais sobre a manipulação de eventos de entrada e a execução de métodos aguardados dentro deles, veja Visão geral de eventos e eventos roteados.

Neste tópico, não vamos entrar em muitos detalhes sobre o que o compilador faz com o operador await, mas vamos examinar o que o seu aplicativo faz para que ele fique assíncrono e responsivo. Considere o que acontece quando você usa o código síncrono. Por exemplo, suponha que exista um método chamado SyndicationClient.RetrieveFeed que seja síncrono. (Esse método não existe, mas imagine por um momento que ele exista.) Se o seu aplicativo incluiu a linha SyndicationFeed feed = client.RetrieveFeed(feedUri), em vez de SyndicationFeed feed = await client.RetrieveFeedAsync(feedUri), a execução do aplicativo será interrompida até que o valor retornado por RetrieveFeed esteja disponível. E. enquanto o seu aplicativo aguarda a conclusão do método, ele não pode responder a nenhum outro evento, como outro evento Click. Ou seja, seu aplicativo fica bloqueado até que RetrieveFeed seja retornado.

Mas, se você chamar client.RetrieveFeedAsync, o método iniciará a recuperação e será retornado imediatamente. Quando você usa await com RetrieveFeedAsync, o aplicativo sai temporariamente do manipulador de eventos. Dessa forma, ele pode processar outros eventos enquanto RetrieveFeedAsync é executado de maneira assíncrona. Isso mantém o aplicativo responsivo para o usuário. Quando RetrieveFeedAsync é finalizado e SyndicationFeed está disponível, o aplicativo basicamente volta a entrar no manipulador de eventos de onde saiu, depois de SyndicationFeed feed = await client.RetrieveFeedAsync(feedUri), e conclui o restante do método.

A vantagem de usar o operador await é que o código não é muito diferente de se você usar o método imaginário RetrieveFeed. Existem maneiras de escrever código assíncrono em C# ou Visual Basic sem o operador await, mas o código resultante tende a enfatizar os mecanismos de execução de maneira assíncrona. Isso torna o código assíncrono difícil de escrever, entender e manter. Mas, usando o operador await, você obtém os benefícios de um aplicativo assíncrono sem tornar o seu código complexo.

Tipos de retorno e resultados de APIs assíncronas

Se você tiver seguido o link para RetrieveFeedAsync, deve ter notado que o tupo de retorno de RetrieveFeedAsync não é um SyndicationFeed. Em vez disso, o tipo de retorno é IAsyncOperationWithProgress<SyndicationFeed, RetrievalProgress>. Exibida como sintaxe simples. uma API assíncrona retorna um objeto que contém o resultado no seu interior. Embora seja comum, e às vezes útil, pensar em um método assíncrono como sendo aguardado, o operador await na verdade, opera sobre o valor de retorno do método, e não no método. Ao aplicar o operador await, você obtém o resultado dos métodos assíncronos. Especificamente, você obtém o resultado da chamada GetResult no objeto que você vê na sintaxe simples. No exemplo, SyndicationFeed é o resultado de RetrieveFeedAsync.

Ao usar um método assíncrono, você pode obter informações sobre seu resultado, observando o tipo de retorno. Todas as APIs assíncronas do Tempo de Execução do Windows retornam um dos seguintes tipos:

O tipo de resultado de um método assíncrono é o mesmo que o parâmetro do tipo TResult. Os tipos sem um TResult não têm um resultado. Você pode pensar no resultado como sendo void. No Visual Basic, um procedimento Sub é equivalente a um método com um tipo de retorno void

A tabela abaixo dá exemplos de métodos assíncronos e lista o tipo de retorno e o tipo de resultado de cada um.

Método assíncronoTipo de retornoTipo de resultado
SyndicationClient.RetrieveFeedAsync IAsyncOperationWithProgress<SyndicationFeed, RetrievalProgress> SyndicationFeed
FileOpenPicker.PickSingleFileAsync IAsyncOperation<StorageFile> StorageFile
XmlDocument.SaveToFileAsync IAsyncAction void
InkStrokeContainer.LoadAsync IAsyncActionWithProgress<UInt64> void
DataReader.LoadAsync DataReaderLoadOperation, uma classe de resultados personalizados que implementa IAsyncOperation<UInt32> UInt32

 

Os métodos assíncronos que estão em .NET for Windows Runtime apps têm o tipo de retorno Task ou Task<TResult> . Os métodos que retornam Task são semelhantes aos métodos assíncronos no Tempo de Execução do Windows que retornam IAsyncAction. Em cada caso, o resultado do método assíncrono é void. Da mesma forma, o tipo de retorno Task<TResult> é semelhante ao IAsyncOperation<TResult>, no sentido de que o resultado do método assíncrono ao executar a tarefa é o mesmo tipo do parâmetro tipo TResult. Para saber mais sobre como usar .NET for Windows Runtime apps e tarefas, veja Visão geral do .NET para aplicativos do Tempo de Execução do Windows.

Manipulando erros

Ao usar o operador await para recuperar os seus resultados de um método assíncrono, você pode usar um bloco try/catch para manipular erros que ocorrem em métodos assíncronos, da mesma forma efetuada para os métodos síncronos. O exemplo mostrado anteriormente encapsula o método RetrieveFeedAsync e a operação await em um bloco try/catch para manipular erros quando uma exceção é acionada.

Quando métodos assíncronos chamam outros método assíncronos, qualquer método assíncrono resulta na propagação de uma exceção para os métodos externos. Isso significa que você pode colocar um bloco try/catch no método mais externo para apanhar métodos assíncronos aninhados. Novamente, isso é semelhante a obter exceções para métodos síncronos. Porém, não é possível usar await no bloco catch block.

Resumo e próximas etapas

O padrão de chamada um método assíncrono que vamos mostrar aqui é o mais simples de usar quando você chamar APIs assíncronas em um manipulador de eventos. Você também pode usar esse padrão quando chamar um método assíncrono em um método substituído que retorna void ou um Sub no Visual Basic.

Quando você encontrar métodos assíncronos no Tempo de Execução do Windows, é importante ter em mente os seguintes pontos:

  • Por convenção, os métodos assíncronos recebem nomes que terminam em "Async".
  • Qualquer método que use o operador await deve ter sua declaração marcada com a palavra-chave async.
  • Quando um aplicativo encontra o operador await, o aplicativo continua respondendo à interação do usuário enquanto o método assíncrono é executado.
  • Um método assíncrono retorna um objeto que contém o resultado. Na maioria dos casos, o resultado do valor de retorno é o que é útil, não o valor de retorno em si. Você pode encontrar o tipo de resultado olhando o tipo de retorno.
  • O uso de APIs assíncronas e padrões async é geralmente uma forma de aprimorar o desempenho do seu aplicativo. Para obter mais informações sobre os benefícios do desempenho ao usar APIs assíncronas, veja Manter o thread de IU responsivo; esse tópico discute especificamente uma lógica de implementação como uma Task para que ela seja assíncrona.

O exemplo deste tópico envia um texto com esta aparência.

Windows Experience Blog
PC Snapshot: Sony VAIO Y, 8/9/2011 10:26:56 AM -07:00
Tech Tuesday Live Twitter #Chat: Too Much Tech #win7tech, 8/8/2011 12:48:26 PM -07:00
Windows 7 themes: what’s new and what’s popular!, 8/4/2011 11:56:28 AM -07:00
PC Snapshot: Toshiba Satellite A665 3D, 8/2/2011 8:59:15 AM -07:00
Time for new school supplies? Find back-to-school deals on Windows 7 PCs and Office 2010, 8/1/2011 2:14:40 PM -07:00
Best PCs for blogging (or working) on the go, 8/1/2011 10:08:14 AM -07:00
Tech Tuesday – Blogging Tips and Tricks–#win7tech, 8/1/2011 9:35:54 AM -07:00
PC Snapshot: Lenovo IdeaPad U460, 7/29/2011 9:23:05 AM -07:00
GIVEAWAY: Survive BlogHer with a Sony VAIO SA and a Samsung Focus, 7/28/2011 7:27:14 AM -07:00
3 Ways to Stay Cool This Summer, 7/26/2011 4:58:23 PM -07:00
Getting RAW support in Photo Gallery & Windows 7 (…and a contest!), 7/26/2011 10:40:51 AM -07:00
Tech Tuesdays Live Twitter Chats: Photography Tips, Tricks and Essentials, 7/25/2011 12:33:06 PM -07:00
3 Tips to Go Green With Your PC, 7/22/2011 9:19:43 AM -07:00
How to: Buy a Green PC, 7/22/2011 9:13:22 AM -07:00
Windows 7 themes: the distinctive artwork of Cheng Ling, 7/20/2011 9:53:07 AM -07:00

Tópicos relacionados

Mapa de aplicativos do Tempo de Execução do Windows em C# ou Visual Basic
Padrão assíncrono baseado em tarefa (TAP) - whitepaper
Cenários de recursos de exemplo de Reversi: código assíncrono

 

 

Mostrar:
© 2014 Microsoft