El uso de Rx para llamar a un método de servicio WCF asíncrono está causando problemas de cierre

StackOverflow https://stackoverflow.com/questions/4401566

Pregunta

Actualmente estoy usando el código ma llamar a un servicio web para obtener datos de una página de aplicación. Todo va bien hasta que intento llamar a este método 10 veces seguidas sin esperar a que la primera llamada a fin.

Si lo hace, me está causando a tener un problema con el cierre y me sale el mismo objeto de resultado para todos mis resultados.

¿alguien ha enfrentado esto con Rx.Net antes? Si es así, ¿alguien tiene una idea o una ventaja para que pueda resolver este problema.

    public void GetPage(long pageId, Action<PageDTO> observer)
    {

        Observable.FromEvent<GetPageCompletedEventArgs>(
            handler => Service.GetPageCompleted += handler,
            handler => Service.GetPageCompleted -= handler)
            .Select(eventHandler => eventHandler.EventArgs.Result)
            .Take(1) // necessary to ensure the observable unsubscribes
            .ObserveOnDispatcher() // controls which thread the observer runs on;
            .Subscribe(observer, HandleError);

        Service.GetPageAsync(pageId);
    }
¿Fue útil?

Solución

Es Service siempre la misma instancia? Si es así, vas a correr en todo tipo de locura el que GetPageCompleted eventos serán manejados por el FromEvent creado por una llamada diferente (con diferentes argumentos), lo que explicaría por qué sus resultados son los mismos para todos los métodos que fueron llamados a al mismo tiempo.

Puede solucionar este problema específico utilizando los métodos END BEGIN /, aunque se sigue siendo probable tener problemas con la contención en la conexión subyacente.

public void GetPage(long pageId, Action<PageDTO> observer)
{
    Observable.FromAsyncPattern<long, PageDTO>(
            service.BeginGetAwards, service.EndGetAwards)(pageId)
        .ObserveOnDispatcher() // controls which thread the observer runs on;
        .Subscribe(observer, HandleError);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top