En utilisant Rx pour appeler une méthode de service WCF Async est à l'origine des problèmes de fermeture

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

Question

Je suis actuellement en utilisant ce code tu appeler un webservice pour obtenir des données pour une page d'application. Tout va bien jusqu'à ce que je tente d'appeler cette méthode 10 fois de suite, sans attendre le premier appel à la fin.

Cela me cause d'avoir un problème avec la fermeture et je reçois le même objet de résultat pour tous mes résultats.

quelqu'un a fait face à ce avec Rx.Net avant? si oui que quelqu'un a une idée ou une avance pour que je puisse résoudre ce problème.

    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);
    }
Était-ce utile?

La solution

est Service toujours la même instance? Si oui, vous allez courir dans toutes sortes de folie où les événements de GetPageCompleted seront traitées par le FromEvent créé par un autre appel (avec des arguments différents), ce qui expliquerait pourquoi vos résultats sont les mêmes pour toutes les méthodes qui ont été appelés à en même temps.

Vous pouvez contourner ce problème spécifique en utilisant les méthodes de début / fin, mais vous aurez toujours probablement un problème avec contention sur la connexion sous-jacente.

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);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top