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:
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:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Super DVD C# - Recursos de aprendizagens e vídeo aulas para C#
Curso Fundamentos da Programação Orientada a Objetos com VB .NET
VB .NET - Usando o controle BackgroundWorker - Macoratti.net
VB .NET - Programação assíncrona com Thread Pools - Macoratti.net