none
WEBservice RRS feed

  • Pergunta

  • Boa Noite
    Galera, to com uma aplicação aqui que fa o seguinte: Ela consulta um webservice e traz uma lista de valores. Esta lista de valores é comparada com um valor especifico na aplicação algo do tipo: se for igual faz isso se for diferente faz aquilo. Bom so que tem horas mesmo sabendo que na lista de valores retornado existe o valor procurado ele diz q não ha valor.
    Executando a aplicação passo a passo, descobri que faz a checagem de valores antes do webservice retornar qq valor. Tem como fazer com que uma função a ser executada após o retorno do webservice só seja mesmo executada após esse retorno concluido??
    • Movido Ricardo Oneda sexta-feira, 26 de junho de 2009 11:24 (De:.NET Development - Geral)
    sexta-feira, 26 de junho de 2009 03:51

Todas as Respostas

  • Jjunior,

    não ficou claro como "faz a checagem de valores antes do webservice retornar qq valor." Poderia colocar um exemplo de código?
    Ricardo Oneda Acesse o blog de Ricardo Oneda Acesse o perfil de Ricardo Oneda no Twitter
    sexta-feira, 26 de junho de 2009 11:23
  • Boa Tarde
    Fiz uns teste aqui e se não estou enganado esta acontecendo o seguinte:

    Chamo 2 funções F1 e F2 nessa sequencia. As duas fazem uma consulta em um banco de dados atravez de um WCF. Porem ele n espera que F1 termine para iniciar F2. Correto??

    Se sim, como fazer para q a espera aconteça??
    sexta-feira, 26 de junho de 2009 19:13
  • Voce pode dispara as duas consultas, cada uma em uma Thread separada.

    Trabalhei pouco com WCF, mas com proxy de WebService todos os metodos tinha a opção de execução assincronona, por exemplo os metodos no meu webservice chamados F1 e F2 poderiam ser executados atraves dos metodos F1Async e F2Async.

    Mas focando ao uso de Threads:

    Crie uma classe para execução assincrona do seu servico:

    public delegate void ServiceResultEventHandler(object response);
    
        public class ServiceAsync {             
            public class F1Args {
                public int A { get; set; }
                public int B { get; set; }
            }
    
            public class F2Args {
                public int A { get; set; }
                public int B { get; set; }
            }        
    
            private object Service;
            public event ServiceResultEventHandler OnF1Response;
            public event ServiceResultEventHandler OnF2Response;
    
            public ServiceAsync(object service) {
                this.Service = service;
            }
    
            private void StartF1(object args) {
                var parametros = (F1Args)args;
                var response = Service.F1(parametros.A, parametros.B);
                if (this.OnF1Response != null) this.OnF1Response(response);
            }
    
            private void StartF2(object args) {
                var parametros = (F2Args)args;
                var response = Service.F2(parametros.A, parametros.B);
                if (this.OnF2Response != null) this.OnF2Response(response);
            }
    
            public void F1(int a, int b) {
                var args = new F1Args() { A = a, B = b };
                var thread = new Thread(new ParameterizedThreadStart(this.StartF1));
                thread.Start(args);
            }
    
            public void F2(int a, int b) {
                var args = new F1Args() { A = a, B = b };
                var thread = new Thread(new ParameterizedThreadStart(this.StartF2));
                thread.Start(args);
            }
        }
    Ah... o objeto Service deve ser do tipo do seu WCF Service ok ?

    Para executar os metodos ficaria assim:

            public void Executar() {
                ServiceAsync wcf = new ServiceAsync("Instancia do teu Service");
                wcf.OnF1Response += new ServiceResultEventHandler(wcf_OnF1Response);
                wcf.OnF2Response += new ServiceResultEventHandler(wcf_OnF2Response);
                wcf.F1(0, 0);
                wcf.F2(1, 1);
            }
    
            void wcf_OnF2Response(object response) {
                // pega a resposta no objeto response
            }
    
            void wcf_OnF1Response(object response) {
                // pega a resposta no objeto response
            }




    Se não funciona de um jeito, tente de outro totalmente diferente ^_^
    sexta-feira, 26 de junho de 2009 22:24
    Moderador