none
Retardar sequencia de instruções RRS feed

  • Pergunta

  • Olá Pessoal,

     

    Estou necessitando de uma ajuda de vcs.

    Na inicialização de um UserControl, mais precisamente no método Loaded, tenho que carregar algumas configurações que estão no Banco de Dados. Para fazer este serviço utilizo o WCF.  Acontece que quando estou executando pela primeira vez e o BD esta em standby, o tempo de recuperação das informações do BD são demoradas, pois ele vai fazer todo o processo de partida do banco. Até aqui tudo bem. O meu problema é que as seqüências de procedimentos que estão no método Loaded não param, ou seja, enquanto esta ocorrendo a consulta no BD, as outras instruções continuam sendo executadas. Pegunto: Existe alguma maneira de eu retardar a execução da sequencia de procedimentos até que eu receba o retorno da consulta ao BD ?

    abs,

    Pedro Palma

    sábado, 22 de maio de 2010 14:19

Respostas

  • Malz... esqueci que metodo assincrono roda na mesma Thread da aplicação principal

    vc vai ter q dar uma adaptada... mas o lance é jogar a chamada da carga numa outra thread mesmo... ai nem prescisa usar o assincrono

    private static ManualResetEvent = new ManualResetEvent(false);

    private void MeuControl_Loaded(object sender, EventArgs e) {
          mre.Reset(); 

         var thread = new Thread(new ParameterizedThreadStart(Carregar));
         thread.Start(objetoASerCarregado);
          mre.WaitOne();

          // Executar o resto
    }

        public static void Carregar(object objeto) {


          var service = new SeuWCF();
          (objeto as DataGrid).DataSource = service.GetDados();
          mre.Set();
        }


    What would Brian Boitano do ?
    ((2B || !2B) is Question) ?
    • Marcado como Resposta Pedro Palma segunda-feira, 24 de maio de 2010 12:47
    domingo, 23 de maio de 2010 01:44
    Moderador
  • Oi Pedro,

    Não sei se entendi errado mas porque não executa no callback o que você iria executar no handler do evento Loaded?

    private void MeuControl_Loaded(object sender, EventArgs e)
    {
        var service = new SeuWCF();
        service.GetDadosCompleted += new EventHandler<GetDadosCompletedEventArgs>(client_GetDadosCompleted);
        service.GetDadosAsync();
    }

    private void client_GetDadosCompleted(object sender, GetDadosCompletedEventArgs e)
    {
        // execute aqui o que faria no evento Loaded
        ...
    }

    Não entendo a necessidade de realizar tudo no handler do Loaded.

    Att.

    Ari C. Raimundo
    MCAD, MCTS
    http://araimundo.blogspot.com

    • Marcado como Resposta Pedro Palma segunda-feira, 24 de maio de 2010 12:47
    segunda-feira, 24 de maio de 2010 02:52
    Moderador

Todas as Respostas

  • Olá Pesoal,

    Acho que a única maneira é usando uma Thread.
    Se alguem tiver outra solução, por favor, poste-a aqui.

    abs,

    Pedro Palma

    sábado, 22 de maio de 2010 15:20
  • Com uma Thread e o ManualResetEvent :)

    Vc tambem pode usar os metods assincronos do teu WCF

        private void MeuControl_Loaded(object sender, EventArgs e) {
          this.Carregar();
          // Executar o resto
        }
    
        public void Carregar() {
          mre.Reset();
    
          var service = new SeuWCF();
          service.GetDadosCompleted += new EventHandler<GetDadosCompletedEventArgs>(client_GetDadosCompleted);
          service.GetDadosAsync();
          mre.WaitOne();
        }
    
        void client_GetDadosCompleted(object sender, GetDadosCompletedEventArgs e) {
          // Carrega os dados na tela
          mre.Set();
        }

     

     


    What would Brian Boitano do ?
    ((2B || !2B) is Question) ?
    sábado, 22 de maio de 2010 15:31
    Moderador
  • Olá
    Rui Santos,

    Obrigado pela sua ajuda.
    Fiz exatamente conforme o seu modelo que tambem é a forma que eu uso (mas sem o mre). Debuguei o programa e esta acontecendo o seguinte:

    -No método Carregar, quando chega em mre.WaitOne() ele fica aguardando e não sai do lugar, sendo necessário abortar a execução do debug,
    -Se eu colocar uma valor no mre.WaitOne(1000), ele termina o metodo Carregar, volta para o metodo Loaded, executa o resto do metodo, só após a finalização do método é que vai executar o método "client_GetDadosCompleted". Ai a vaca já foi para o brejo, rs, pois é exatamente este o meu problema.

    Eu quero que no metodo Loaded chame o metodo Carregar, que por sua vez execute o metodo client_GetDadosCompleted para depois retornar ao método Loadd e executar o restante do metodo.

    abs,

    Pedro Palma

    sábado, 22 de maio de 2010 19:12
  • Malz... esqueci que metodo assincrono roda na mesma Thread da aplicação principal

    vc vai ter q dar uma adaptada... mas o lance é jogar a chamada da carga numa outra thread mesmo... ai nem prescisa usar o assincrono

    private static ManualResetEvent = new ManualResetEvent(false);

    private void MeuControl_Loaded(object sender, EventArgs e) {
          mre.Reset(); 

         var thread = new Thread(new ParameterizedThreadStart(Carregar));
         thread.Start(objetoASerCarregado);
          mre.WaitOne();

          // Executar o resto
    }

        public static void Carregar(object objeto) {


          var service = new SeuWCF();
          (objeto as DataGrid).DataSource = service.GetDados();
          mre.Set();
        }


    What would Brian Boitano do ?
    ((2B || !2B) is Question) ?
    • Marcado como Resposta Pedro Palma segunda-feira, 24 de maio de 2010 12:47
    domingo, 23 de maio de 2010 01:44
    Moderador
  • Oi Pedro,

    Não sei se entendi errado mas porque não executa no callback o que você iria executar no handler do evento Loaded?

    private void MeuControl_Loaded(object sender, EventArgs e)
    {
        var service = new SeuWCF();
        service.GetDadosCompleted += new EventHandler<GetDadosCompletedEventArgs>(client_GetDadosCompleted);
        service.GetDadosAsync();
    }

    private void client_GetDadosCompleted(object sender, GetDadosCompletedEventArgs e)
    {
        // execute aqui o que faria no evento Loaded
        ...
    }

    Não entendo a necessidade de realizar tudo no handler do Loaded.

    Att.

    Ari C. Raimundo
    MCAD, MCTS
    http://araimundo.blogspot.com

    • Marcado como Resposta Pedro Palma segunda-feira, 24 de maio de 2010 12:47
    segunda-feira, 24 de maio de 2010 02:52
    Moderador
  • Olá Rui e Ari,

    Obrigado pelas respostas.

    A solução do Rui é bastante elegante, pois é um modelo que gosto de seguir.
    A solução do Ari é a mesma que eu apliquei para obter os resultados esperados e tambem funcionam perfeitamente, mas particularmente não gosto muito, por um motivo muito simples: Sou dos antigos (rs), onde aprendi a programar em Cobol, na época não tinhamos POO mas codificavamos os programas de maneira estruturada, então tinhamos um método principal onde controlavamos todas as ações do programa, fazendo as chamadas a outros métodos a partir do método principal, assim ficava facil a leitura e a manutenção por qualquer outro programador.
    Mas valeu as respostas,

    abs,

    Pedro Palma

    segunda-feira, 24 de maio de 2010 12:54
  • olha... é bom saber usar o ManualResetEvent... por varios motivos... mas sou obrigado a concordar com o Ari nessa :P

    é melhor começar a ir acostumando a usar o OO e programação assincrona pq o Silverlight é uma evolução de uma serie de conceitos atuais (Programação orientada a requisiçoes web como uma pagina ajax, mas com tratamento de eventos similiar a uma aplicaçao windows com conceito de desenho de telas em xaml....)

    Deve dar mais trabalho para vc no inicio... mas manter um padrao estruturado no Silverlight vai acabar sendo mais custoso mais para frente... por exemplo... na hora que vc decidir trabalhar com Services Duplex com implementação de Callbacks...


    What would Brian Boitano do ?
    ((2B || !2B) is Question) ?
    terça-feira, 25 de maio de 2010 04:17
    Moderador