VB .NET - Programação assíncrona com Async e Wait


 Neste artigo vou mostrar os recursos básicos da programação assíncrona usando Async e Wait  na linguagem VB .NET.

Você pode evitar gargalos de desempenho e melhorar a capacidade de resposta global do seu aplicativo usando a programação assíncrona. No entanto, as técnicas tradicionais para escrever aplicativos assíncronos podem ser um tanto complicadas , tornando-as difíceis de escrever, depurar e manter.

A versão 4.5 da plataforma .NET (Visual Studio 2012) introduz uma abordagem simplificada, com suporte a programação assíncrona no .NET Framework 4.5 e o Runtime do Windows.

O compilador faz o trabalho difícil para o desenvolvedor, e sua aplicação mantém uma estrutura lógica que se assemelha ao código síncrono. Como resultado, você obtém todas as vantagens de programação assíncrona com uma fração do esforço anteriormente necessário.

Melhorando a resposta com operações Assíncronas (Async)

As operações assíncronas são essenciais para as atividades que são potencialmente de bloqueio, tal como quando seu aplicativo acessa a web. O acesso a um recurso da Web, por vezes é lento ou demorado. Se tal atividade for bloqueada dentro de um processo síncrono, todo o aplicativo deve esperar. Em um processo assíncrono, o aplicativo pode continuar fazendo outro trabalho que não depende do recurso web até que o bloqueio da tarefa termine.tarefas.

A tabela a seguir mostra as áreas típicas onde a programação assíncrona melhora a capacidade de resposta :

Tipo de aplicação   APIs que suportam métodos assíncronos (async)
Acesso a web   HttpClient, SyndicationClient
Acesso a arquivos   StorageFile, StreamWriter, StreamReader, XmlReader
Trabalhando com Imagens   MediaCapture, BitmapEncoder, BitmapDecoder
Acessando web services   Operações síncronas ou assíncronas

As operações assíncronas são muito úteis em cenários que acesso a interface do usuário visto que em geral as atividades relacionados a interface do usuários são compartilhadas em uma thread.

Se qualquer processo for bloqueados em uma aplicação síncrona, todos estão bloqueados.  Sua aplicação deixa de responder e você pode concluir que ela falhou quando ao invés disso, ela esta apenas esperando.

Quando você usa métodos assíncronos, o aplicativo continua a responder à interface do usuário e você pode redimensionar ou minimizar uma janela, por exemplo, ou você pode fechar o aplicativo se você não quiser esperar ele terminar.

As palavras-chave Async e Await no Visual Basic são o coração da programação assíncrona.  Ao usar essas duas palavras-chave, você pode usar recursos do .NET Framework ou do RunTime do Windows para criar um método assíncrono quase tão facilmente como você cria um método síncrono.

Os métodos assíncronos que você define usando Async e Await são referidos como métodos async.

Recursos usados:

Nota: Baixe e use a versão Community 2015 do VS ela é grátis e é equivalente a versão Professional.

Criando o projeto no VS Community

Abra o VS Community 2015 e clique em New Project;

Selecione a linguagem Visual Basic -> Windows  e o template Console Application.

Informe o nome VBNET_Async e clique no botão OK;

Será criado uma aplicação Console contendo o módulo Module1.vb.

Baixando dados de um página Web de forma assíncrona usando Task, Async e Await

Nosso objetivo é mostrar como realizar operações assíncronas usando Async e Await e para isso vamos realizar uma tarefa simples.

Vamos acessar uma página na internet e baixar parte de seu conteúdo em nossa aplicação Console.

Inclua o código abaixo no arquivo Module1.vb:

Imports System.Net.Http
Module Module1
    Sub Main()
        ' Criando uma nova Tarefa(Task)
        ' ... Usando o operador AddressOf para referenciar o metodo.
        Dim t As Task = New Task(AddressOf DownloadPaginaAsync)
        ' Inicia a tarefa
        t.Start()
        ' Imprime uma mensagem enquanto do download é feito
        Console.WriteLine("Baixando a página...")
        Console.ReadLine()
    End Sub
    Async Sub DownloadPaginaAsync()
        Dim pagina As String = "http://www.macoratti.net/"
        ' Usando a classe HttpClient em uma instrução Using
        ' ... Usando GetAsync para pegar os dados da pagina
        Using cliente As HttpClient = New HttpClient()
            Using resposta As HttpResponseMessage = Await cliente.GetAsync(pagina)
                Using conteudo As HttpContent = resposta.Content
                    ' Pega o conteúdo da página como uma string
                    Dim resultado As String = Await conteudo.ReadAsStringAsync()
                    ' Se existem dados imprime uma parte dos dados usando Substring.
                    If resultado IsNot Nothing And resultado.Length > 300 Then
                        Console.WriteLine(resultado.Substring(0, 300) + "...")
                    End If
                End Using
            End Using
        End Using
    End Sub
End Module

Neste código estamos realizando uma operação assíncrona acessando uma página na web.(O resultado é visto na figura ao lado)

Vamos entender o código:

No método Main() estamos criando uma instância da classe Task(), onde usamos o operador AddressOf para criar  uma instância delegada de procedimento que refere-se ao procedimento DownloadPaginaAsync().

Quando o objeto Task é instanciado, a tarefa não será executada imediatamente. Em vez disso, a ela é dado o status Created. A tarefa é, então iniciada pela chamada do método Start() da classe Task.

A tarefa é uma promessa de obter os dados de uma página web quando a a operação for concluída.

No método DownloadPaginaAsync() devemos observar 3 detalhes importantes:

  1. O método usa o modificador Async;
  2. Não há retorno do tipo (pois usamos uma Sub);
  3. O método inclui a palavra-chave Await que marca um ponto no qual o método não pode continuar até que a operação assíncrona seja concluída. Neste ponto o método é suspendo e o controle retorna ao chamador do método.

Você aplica o operador de Await a um operando em um método assíncrono ou na expressão lambda para suspender a execução do método até que a tarefa deve terminar. A tarefa representa um trabalho em andamento. Dessa forma o método no qual Await é aplicado deve ter um modificador de Async . 

No nosso exemplo o operador Await é aplicado aos métodos a seguir:

Quando ele é executado ele suspende a execução em DownloadPaginaAsync até que a tarefa seja concluída. Enquanto isso, o controle é retornado ao chamador de DownloadPaginaAsync.

Dessa forma, em métodos assíncronos, usamos as palavras-chave e tipos para indicar o que desejamos fazer, e o compilador faz o resto, incluindo a manutenção do controle sobre o que deve acontecer quando o controle retornar para um ponto de Await em um método suspenso.

Concluímos então que você especificar que um método é um método assíncrono usando um modificador Async, você esta permitindo as seguintes capacidades :

A suspensão de um método Async(assíncrono) em uma expressão Await não constitui uma saída(exit) do método, e, dessa forma, blocos finally não são executados.

Alguns processos em rotinas, como loops e manipulação de exceççoes podem ser difíceis de manusear em um código assíncrono tradicional, mas usando os novos recursos de Async e Await em um método assíncrono, você escreve esses elementos da mesma forma que faria usando a abordagem síncrona sem muito esforço.

Pegue o projeto completo aqui :  VBNET_Async.zip

"Porque estas nações, que hás de possuir, ouvem os prognosticadores e os adivinhadores; porém a ti o Senhor teu Deus não permitiu tal coisa."
Deuteronômio 18:14

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Referências:


José Carlos Macoratti