Estás en: Web Service Async

Web Service Async

Para dar las gracias debes entrar o registrarte en el foro

Nuevo miembro
Nuevo miembro
Mensajes: 3 Agradecido: 0
05 Jun 2012, 05:18# 1

Tengo el siguiente problema , estoy invocando un webService conversor de monedas en una clase , el valor arrojado lo debo usar para realizar calculos , pero al ser una llamada Asincrona del Servicio , el programa no funciona correctamente ya que no alcanza a hacer la operacion cuando mando la respuesta como parametro para otra clase.

Código: Seleccionar todo
 public class ArrojaPeso
    {
       
   
        public  ConversorMoneda.Currency divisaExtranjera;
        public double cifra;
        public ArrojaPeso(string moneda)
        {

            this.divisaExtranjera = Constantes.devuelveNombreMoneda(moneda);

        }
       

        public void convierteAPeso(double valor)
        {
            ConversorMoneda.CurrencyConvertorSoapClient cliente = new ConversorMoneda.CurrencyConvertorSoapClient();
            cliente.ConversionRateCompleted += new EventHandler(cliente_ConversionRateCompleted);
            cliente.ConversionRateAsync(ConversorMoneda.Currency.USD, ConversorMoneda.Currency.COP);
         
           
        }

   

        void cliente_ConversionRateCompleted(object sender, ConversorMoneda.ConversionRateCompletedEventArgs e)
        {
           this.cifra=e.Result;
        }

    }


El problema es que el e.Result no me lo retorna a tiempo ya que es una llamada Asincrona , por lo que he visto debo utilizar Hilos para resolver este problema , pero no encuentro una solucion concreta , Gracias de ante mano
Gracias  
Etiquetado en:
Administrador
Administrador
Mensajes: 826 Agradecido: 119
05 Jun 2012, 19:08# 2
alejofila escribió:Tengo el siguiente problema , estoy invocando un webService conversor de monedas en una clase , el valor arrojado lo debo usar para realizar calculos , pero al ser una llamada Asincrona del Servicio , el programa no funciona correctamente ya que no alcanza a hacer la operacion cuando mando la respuesta como parametro para otra clase.
Código: Seleccionar todo
 public class ArrojaPeso
    {
       
   
        public  ConversorMoneda.Currency divisaExtranjera;
        public double cifra;
        public ArrojaPeso(string moneda)
        {

            this.divisaExtranjera = Constantes.devuelveNombreMoneda(moneda);

        }
       

        public void convierteAPeso(double valor)
        {
            ConversorMoneda.CurrencyConvertorSoapClient cliente = new ConversorMoneda.CurrencyConvertorSoapClient();
            cliente.ConversionRateCompleted += new EventHandler(cliente_ConversionRateCompleted);
            cliente.ConversionRateAsync(ConversorMoneda.Currency.USD, ConversorMoneda.Currency.COP);
         
           
        }

   

        void cliente_ConversionRateCompleted(object sender, ConversorMoneda.ConversionRateCompletedEventArgs e)
        {
           this.cifra=e.Result;
        }

    }


El problema es que el e.Result no me lo retorna a tiempo ya que es una llamada Asincrona , por lo que he visto debo utilizar Hilos para resolver este problema , pero no encuentro una solucion concreta , Gracias de ante mano


La llamada que tienes ya es un hilo (por eso es asíncrona), no necesitas nada más.

A simple vista esta todo bien. Lo único que se me ocurre es que la llamada al web service este fallando, por eso result esta vacío.

Pon un breakpoint en la línea this.cifra=e.Result y revisa el valor de las propiedades de e. Puede que ahí veas la respuesta.

Si no, si el servicio es tuyo y lo tienes en local, depuralo con la llamada desde tu aplicación.
Gracias  
Nuevo miembro
Nuevo miembro
Mensajes: 3 Agradecido: 0
05 Jun 2012, 20:53# 3

Gracias por la resupuesta . El problema no es ese , sino que esa clase que cite es invocada por mi clase control y a su vez esta es invocada dentro de una PhoneApplicationPage , y con el valor retornado deberia hacer unos calculos y enviarlos como parametros a otra pagina . El problema es que cuando envia los parametros todavia no ha retornado lo que me deberia retornar el WebService . Podrias Darme una mano , entiendo que debo declarar de alguna forma que no envie los parametros hasta que NO haya llegado la respuesta, pero no se hacerlo.

Gracias  
Administrador
Administrador
Mensajes: 826 Agradecido: 119
06 Jun 2012, 03:08# 4
alejofila escribió:Gracias por la resupuesta . El problema no es ese , sino que esa clase que cite es invocada por mi clase control y a su vez esta es invocada dentro de una PhoneApplicationPage , y con el valor retornado deberia hacer unos calculos y enviarlos como parametros a otra pagina . El problema es que cuando envia los parametros todavia no ha retornado lo que me deberia retornar el WebService . Podrias Darme una mano , entiendo que debo declarar de alguna forma que no envie los parametros hasta que NO haya llegado la respuesta, pero no se hacerlo.


A ver si lo entiendo, ¿tienes una PhoneApplicationPage, donde declaras un objeto de la clase ArrojaPeso, y con ese objeto quieres hacer el calculo?

Si es así, el problema, según yo lo veo, es que cuando usas el field del objeto esta vacío. Eso es porque intentas usarlo ANTES de que se ejecute el _completed().

Una posible solución seria que declarases el objeto del web service en la Page y ahí capturases el _completed(), haciendo el calculo que quieres dentro.

No se si me explico.

Si no me entiendes, dimelo e intento ponertelo mas claro. Que desde el móvil es un poco complicado :)
Gracias  
Nuevo miembro
Nuevo miembro
Mensajes: 3 Agradecido: 0
06 Jun 2012, 03:12# 5

Entiendo tu solucion , pero yo quisiera que el codigo entre la vista y la logica no se mezclara tanto , y eso que tu sugieres propone que la conexion al webService la haga directamente en la PhonePage . No habria una solucion que me permitiera llamar a el metodo de mi clase arrojaPeso desde mi PhonePage?

Gracias  
Administrador
Administrador
Mensajes: 826 Agradecido: 119
07 Jun 2012, 19:04# 6
alejofila escribió:Entiendo tu solucion , pero yo quisiera que el codigo entre la vista y la logica no se mezclara tanto , y eso que tu sugieres propone que la conexion al webService la haga directamente en la PhonePage . No habria una solucion que me permitiera llamar a el metodo de mi clase arrojaPeso desde mi PhonePage?


El ConversionRateCompleted no te queda más remedio que capturarlo en la PhoneApplicationPage donde quieres procesar el resultado del web service.

Una posible solución seria que declarases la variable del servicio como property, algo así:

class ArrojaPeso
{
// ...

private ConversorMoneda.CurrencyConvertorSoapClient _cliente;
public ConversorMoneda.CurrencyConvertorSoapClient Cliente
{
get {
// nos aseguramos que _cliente es bueno
if(_cliente == null)
{ _cliente = new ConversorMoneda.CurrencyConvertorSoapClient(); }
return _cliente;
}
set {
if(_cliente != null)
{ _cliente.Close(); }
_cliente = value;
}
}
}

Luego desde tu PhoneApplicationPage, donde crees tu objeto ArrojaPeso, haces:

ArrojaPeso ap = new ArrojaPeso();

ap.Cliente.ConversionRateCompleted += new EventHandler(cliente_ConversionRateCompleted);

cliente.ConversionRateAsync(ConversorMoneda.Currency.USD, ConversorMoneda.Currency.COP);


Y declaras el evento:

void cliente_ConversionRateCompleted(Object sender, ConversorMoneda.ConversionRateCompletedEventArgs e)
{
// Aquí haces lo que quieras con el resultado del web service
}

No se si te sirve, pero es la forma mas sencilla de separar.

Lo suyo seria que hicieses el objeto ArrojaPeso a nivel de clase, y capturases el evento solo una vez, en el Initialized, por ejemplo, y liberases el evento en el destructor así:

ap.Cliente.ConversionRateCompleted -= cliente_ConversionRateCompleted;
Gracias  