Использование Rx для вызова метода службы WCF Async вызывает проблемы с закрытием - PullRequest
2 голосов
/ 09 декабря 2010

В настоящее время я использую этот код для вызова веб-службы для получения данных для страницы приложения. Все в порядке, пока я не попытаюсь вызвать этот метод 10 раз подряд, не дожидаясь завершения первого вызова.

Это вызывает у меня проблему с замыканиями, и я получаю один и тот же объект результата для всех своих результатов.

кто-нибудь сталкивался с этим с Rx.Net раньше? если у кого-то есть идея или предложение, чтобы я мог решить эту проблему.

    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);
    }

1 Ответ

3 голосов
/ 10 декабря 2010

Всегда ли Service один и тот же экземпляр?Если это так, вы столкнетесь со всеми видами сумасшествия, когда GetPageCompleted события будут обрабатываться FromEvent, созданным другим вызовом (с разными аргументами), что объясняет, почему ваши результаты одинаковы для всех методовкоторые были вызваны в одно и то же время.

Вы можете обойти эту конкретную проблему, используя методы Begin / End, хотя у вас все еще могут возникать проблемы с конфликтами в базовом соединении.

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);
}
...