Estratégia para lidar com callbacks assíncronos em Silverlight

Recentemente, conversando com alguns desenvolvedores no trabalho e verificando algumas perguntas publicadas nos fóruns do MSDN, eu notei que ainda há uma dificuldade muito grande tanto de compreensão quanto de implementação para trabalhar com métodos assincronos. Isso se torna um problema particularmente importante em aplicações Silverlight pois todas as chamadas a web services, RIA services, web requests, etc são obrigatoriamente feitos de forma assincrona, não havendo opções para executar essas mesmas operações da forma sincrona e linear à qual a maioria dos desenvolvedores está acostumada.

Acontece que desenvolvimento assincrono não é difícil e, depois que você aprende e se acostuma, você acaba percebendo que suas aplicações passam a funcionar muito melhor. Sim, não vou argumentar aqui contra o fato de que é necessário se acostumar e que começo seja realmente algo estranho, mas posso garantir que demora pouco tempo para se acostumar e os benefícios são muitos.

Há muitas abordagens e estratégias possíveis para desenvolvimento assíncrono e eu vou apresentar aqui uma delas que é bem simples e que eu usei em praticamente todos os projetos Silverlight em dos quais participei. Essa abordagem não envolve o uso de nenhum framework ou biblioteca externa e pode ser utilizada tranquilamente também em projetos que não sejam Silverlight.

Digamos que você precisa obter o html de uma página web por algum motivo. Uma forma de fazer isso seria criando uma nova instância de WebClient, assinando o evento DownloadStringCompleted e depois chamando o método DownloadString passando a url. Ok, não é difícil, mas é um código repetitivo que poderia facilmente ser reaproveitado ao invés de ser copiado por toda sua aplicação em todo lugar onde você precisar fazer download de uma página. O que eu costumo fazer para esse tipo de chamada é criar um método estático em uma classe utilitária e simplesmente chamar esse método passando, nesse caso, minha url e um ponteiro de callback. É mais fácil mostrar:

public static void HttpGet(string url, Action<string, Exception> callback) {
   
if (!string
.IsNullOrWhiteSpace(url)) {
       
var client = new WebClient
();
        client.DownloadStringCompleted += (sender, e) => {
           
if (callback != null
) {
                callback(e.Result, e.Error);
            }
        };
        client.DownloadStringAsync(
new Uri(url));
    }
}

Quais são as vantagens desse método:



  • para executá-lo não é necessário instanciar nenhuma classe
  • é facil de reutilizar
  • permite que a lógica da minha aplicação fique um pouco mais simples, já que não me obriga a assinar nenhum evento no meu código

Para executar esse método, eu posso usar 2 abordagens.


Abordagem 1 – Delegar o retorno para outro método. Nessa abordagem eu chamo o método HttpGet passando a url desejada e o ponteiro de um método que será executado quando o request for concluído.

private void LoadData() {
    HttpGet(
"http://kelps.net"
, DataLoaded);
}

private void DataLoaded(string data, Exception
error) {
   
if (error == null
) {
       
//utiliza os dados retornados na variável "data"
    }
}

Abordagem 2 – Utilizar uma expressão lambda para criar um método anônimo inline no meu código, ao invés de criar uma função separada apenas para processar os dados retornados.

HttpGet("http://twitter.com/kelps", (data, error) => {
   
if (error == null
) {
       
//utiliza os dados retornados na variável "data"
    }
});

A única diferença de funcionamento entre as 2 abordagens acima é que na segunda seria possível utilizar variáveis que estiverem no mesmo escopo da chamada que está sendo feita, ao passo que na primeira seria necessário que essas variáveis fossem globais da classe para que isso funcione. Nos projetos em que trabalho eu costumo utilizar ambas as abordagens, de acordo com o que faz mais sentido em cada situação. Expressões lambda são bem concisas e compactas, mas são claras para qualquer desenvolvedor.


Este foi apenas um pequeno exemplo de como trabalhar com chamadas assincronas sem ficar se perdendo com assinaturas e liberação de eventos. Há outras formas mais complexas e robustas de lidar com isso mas a minha intenção hoje era simplesmente mostrar como dá pra trabalhar de forma simples com código assíncrono, mesmo sem utilizar nenhuma biblioteca externa.

Windows Phone SDK 7.1 Beta 2 Refresh disponível para desenvolvedores

Quem está participando do beta do Windows Phone Mango para desenvolvedores recebeu uma agradável notícia hoje: Foi disponibilizada uma atualização para os aparelhos com um build mais recente do sistema operacional.

O novo build é o 7712, não o 7720, que é a versão RTM. Foi necessário que usássemos essa versão anterior pois é a versão que é compativel com a atualização do SDK e do Zune que estão sendo disponibilizadas neste refresh.

Está previsto que até o final de agosto O Marketplace será aberto para começarmos a publicar aplicações que funcionarão apenas em aparelhos com Windows Phone 7.5, o que nos dará uma chance de testar bem nossas aplicações em vários aparelhos de desenvolvedores antes que esta versão do SO esteja disponível para o público geral. Isso é interessante pois significa que quando a nova versão do SO estiver disponível para o público já haverá várias aplicações no Marketplace tirando proveito das novas capacidades do sistema operacional. Esta atualização de agosto provavelmente virá junto com uma versão RC (Release Candidate) do SDK.

Se você é um desenvolvedor cadastrado no Marketplace, tem um aparelho com Windows Phone e está participando do Beta do Windows Phone Mango, vá agora mesmo ao Connect e instale este refresh, mas não se esqueça de fazer backup dos backups dos seus backups antes de fazer isso, para garantir que você conseguirá voltar o seu telefone para a versão normal quando a versão RTM estiver disponível pois não será possível ir da versão beta diretamente para a versão RTM do WP7.

PS.: Quando você instalar o novo SDK ele vai aparecer como sendo RC na janela de adicionar e remover programas do Windows, mas na verdade esta ainda não é a versão RC do SDK.

Palestra sobre as novidades do Silverlight 5 no TDC2011/SP

Na próxima sexta-feira, dia 08/07 eu irei apresentar uma palestra sobre as novidades do Silverlight 5 no TDC 2011. Se você não se inscreveu ainda, ainda dá tempo. A inscrição no evento é feita por trilha, o que o torna bem mais barato. A palestra de Silverilght 5 será na trilha “.NET Client” que acontecerá no dia 08/07 e o preço do evento por trilha é R$ 60,00.

Para quem não sabe, o TDC (The Developer’s Conference) é uma conferencia de baixo custo sobre desenvolvimento que acontece todos os anos em várias e abrange várias tecnologias. Este ano a conferencia acontecerá em São Paulo (06/07 a 10/07), Florianópolis (20/08 e 21/08) e Goiânia (28/10 e 29/10).

Veja abaixo a lista de palestras da trilha .NET Client de São Paulo, que acontecerá no dia 08/07.

Programação da trilha .NET Client no TDC2011-SP

Espero vocês lá.

Windows Phone SDK 7.1 Beta 2 disponível para download

Se você está interessado no desenvolvimento para Windows Phone 7, ficará feliz em saber que está disponível para download o beta2 das ferramentas de desenvolvimento para Windows Phone 7.1 (mango).

Uma das coisas que mudou foi que agora o download se chama Windows Phone SDK, não mais Windows Phone Development Tools.

Para instalar esta versão é necessário primeiro remover a versão beta anterior.

Em conjunto com essa nova versão, a Microsoft também anunciou que TODOS os desenvolvedores cadastrados no AppHub receberão um convite por email para participar do beta do Windows Phone 7.1 no Connect. Em outras palavras, isso significa que todos os desenvolvedores cadastrados poderão atualizar os seus telefones com uma versão beta do sistema operacional que será lançado no segundo semestre. Essa é uma excelente notícia para quem já está desenvolvendo aplicações utilizando as ferramentas beta que foram lançadas pouco mais de 1 mês atrás.

Você já tem um Windows Phone? Vai instalar este beta nele? Eu vou Winking smile

Conferência BUILD

Hoje a Microsoft anunciou uma nova conferência que acontecerá no Estados Unidos, substituindo o PDC. O nome dessa nova conferência é BUILD Windows.

Ainda não muitas informações sobre conteúdo, mas pelo próprio nome da conferência já fica bem claro que o foco será a plataforma Windows (provavelmente com bastante informação sobre o Windows 8).

As inscrições já estão abertas. Infelizmente eu não poderei ir, pois 2 viagens internacionais não vão caber no meu orçamento deste ano (eu fui para o MVP Summit em fevereiro). Se você puder ir, não perca essa oportunidade.

A conferência acontecerá entre os dias 13 e 16 de setembro deste ano, em Anaheim, Califórnia.

Tags: Eventos