Как я просто вызываю метод службы asyc WCF, используя Rx - PullRequest
0 голосов
/ 29 декабря 2011

Я изо всех сил пытался понять, как использовать Rx. Большинство примеров устарели, ссылаются на начало / конец или длинные и сложные.

У меня есть простой метод службы WCF, который принимает int и возвращает объект JobMaster.

Вот как я это называю сейчас:

    public static void GetJob(int jobId)
    {
        KernServiceClient.GetJobCompleted += GetJobCompleted;
        KernServiceClient.GetJobAsync(jobId);
    }

    private static void GetJobCompleted(object sender, GetJobCompletedEventArgs e)
    {
        // JobMaster available in e.Result
    }

Как мне изменить это, чтобы использовать Rx?

EDIT

Благодаря помощи Пола я проделал большую часть пути туда. Вот как это выглядит сейчас. Единственная проблема - подписка никогда не срабатывает. Есть идеи?

    public static JobMaster GetJob(int jobId)
    {
        JobMaster retval = null;

        IKernService kernServiceInterface = KernServiceClient;

        var getJobFunc = Observable.FromAsyncPattern<int, Server.KernMobileWcfService.JobMaster>(
            kernServiceInterface.BeginGetJob, kernServiceInterface.EndGetJob);

        var result = getJobFunc(jobId);

        result
            .Subscribe
            (
                onNext: x => retval = ConvertJobMaster(x),
                onError: ex => ShowError(ex.Message)
            );

        return retval;
    }

Ответы [ 3 ]

1 голос
/ 29 декабря 2011

http://blog.paulbetts.org/index.php/2010/09/26/calling-web-services-in-silverlight-using-reactivexaml/ // Игнорировать часть ReactiveXaml

Описание: приведите KernServiceClient к интерфейсу, который он реализует для возврата методов Begin / End, используйте FromAsyncPattern.

0 голосов
/ 11 января 2012

что вы делаете с retval когда вы его возвращаете?если вам нужно выполнить дополнительную обработку при следующем завершении, сделайте это в событии onCompleted подписки

0 голосов
/ 02 января 2012

Кажется, вы возвращаете "retval", даже если вы вычисляете его асинхронно и назначаете его из обработчика OnNext.Ваша логика после получения значения от службы должна быть перемещена в обработчик OnNext, или вы должны вернуть IObservable вызывающей стороне.

...