Israel Aéce

Microsoft MVP, MCP, MCAD, MCTS, MCPD e MCT

My Links

Blog Stats

Archives

Post Categories

Links

Login

Chamadas assíncronas à Serviço via modelo de eventos

O WCF fornece, não por padrão, a possibilidade de invocar as operações de um serviço de forma assíncrona. Quando efetuamos a referencia para um serviço via IDE do Visual Studio 2008 ou através do utilitário svcutil.exe (com a opção /async) automaticamente, além da versão síncrona do método, dois métodos chamados BeginXXX/EndXXX (onde XXX é o nome do método síncrono) são adicionados, permitindo que voce invoque assincronamente uma determinada operação.

Além do tradicional modelo de chamadas assíncronas (APM), temos a possibilidade da chamada assíncrona baseada em eventos. A idéia aqui é, antes de invocar a operação, voce poderá assinar à um evento que será disparado somente quando o processo assíncrono finalizar. Isso evitará de ter um trabalho manual para analisar se o processo finalizou ou não (poll, waiting, etc.). Internamente durante a geração do proxy, o código que é auto-gerado já inclui a implementação necessária para o modelo baseado em eventos.

Basicamente é criado mais uma versão do método, agora com o sufixo XXXAsync que, internamente, faz a chamada para os métodos BeginXXX/EndXXX que, como já sabemos, dispararam a operação de forma assíncrona. Além disso, um delegate do tipo EventHandler<T> também será criado para representar o callback que, quando disparado, invocará o evento do lado de quem está consumindo o serviço. Abaixo um exemplo de como efetuar a chamada assíncrona baseada em eventos:

using (ClienteClient p = new ClienteClient())
{
    p.CalcularComissaoCompleted += 
        new EventHandler<CalcularComissaoCompletedEventArgs>(p_CalcularComissaoCompleted);

    p.CalcularComissaoAsync("2");
    Console.ReadLine();
}

static void p_CalcularComissaoCompleted(object sender,
    CalcularComissaoCompletedEventArgs e)
{
    Console.WriteLine("Fim.");
}

Se notarmos a implementação interna do proxy, veremos que o método XXXAsync faz o uso do método InvokeAsync, da classe ClientBase<T>. Este método está disponível somente a partir do .NET Framework 3.5. Sendo assim, alguns detalhes durante a geração do proxy precisam ser analisados:

  • Via "Add Service Reference": se voce estiver fazendo a referencia em um projeto que esteja utilizando o .NET Framework 3.5 e voce opta pela geração dos métodos que dão suporte ao processamento assíncrono, ele também criará os tipos necessários para suportar o modelo de eventos.
  • Via svcutil.exe: neste caso voce precisará especificar através do parametro /async e, além disso, especificar a versão do .NET Framework através do parametro /targetClientVersion, apontando para Version30 ou, se quiser utilizar o modelo baseado em eventos, utilizar a opção Version35.

posted on Saturday, September 06, 2008 1:15 AM

Feedback

# re: Chamadas assíncronas à Serviço via modelo de eventos 9/8/2008 6:20 PM Luis Abreu

Eu detesto os proxies :)

http://www.ayende.com/Blog/archive/2008/03/29/WCF-Async-without-proxies.aspx

# re: Chamadas assíncronas à Serviço via modelo de eventos 9/8/2008 7:16 PM Israel Aece

Ola Luis,

Antes eu utilizava esta técnica (http://weblogs.pontonetpt.com/israelaece/posts/28131.aspx) para testar os serviços WCF. Agora com o WcfTestClient.exe ajuda um pouco mais.

Mas em um ambiente de produção, eu concordo com todo aquele montante de informação que o svcutil.exe gere acaba sendo ruim. O que costumo fazer é isolar a criação do proxy em uma DLL e depois utilizá-la nas aplicações que consomem o serviço.

# re: Chamadas assíncronas à Serviço via modelo de eventos 9/11/2008 4:26 AM Luis Abreu

Com a informacao q o Ayende deu e com + 2/3 linhas de codigo genericas q podem ser reaproveitadas consegues trabalhar so com as interfaces dos servicos sem usar proxies...e uma solucao bem mais limpa acho eu...

# re: Chamadas assíncronas à Serviço via modelo de eventos 9/11/2008 8:53 AM Israel Aece

Ola Luis,

Seria isso: http://weblogs.pontonetpt.com/israelaece/posts/28131.aspx ?

# re: Chamadas assíncronas à Serviço via modelo de eventos 9/12/2008 4:39 AM Luis Abreu

exacto...e ainda podes expandir para, por ex, passar username e pass :) muito melhor do q usar o proxy com codigo desnecessario...so uma opiniao :)

# re: Chamadas assíncronas à Serviço via modelo de eventos 9/12/2008 6:50 AM Israel Aece

Ola Luis,

Relaxa. Seus comentários são sempre bem-vindos ;)

Title  
Name  
Url
Box Code
Protected by FormShield
Comments