如何使用Rx简单地调用异步WCF服务方法

时间:2011-12-29 04:57:39

标签: wcf system.reactive

我一直在努力弄清楚如何使用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?

修改

感谢保罗的帮助,我得到了大部分的帮助。这就是现在的样子。唯一的问题是订阅永远不会触发。有什么想法吗?

    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 个答案:

答案 0 :(得分:1)

http://blog.paulbetts.org/index.php/2010/09/26/calling-web-services-in-silverlight-using-reactivexaml/ //忽略ReactiveXaml部分

总结:将KernServiceClient转换为它实现的接口以返回Begin / End方法,使用FromAsyncPattern。

答案 1 :(得分:0)

即使你是异步计算它并从你的OnNext处理程序中分配它,看起来你正在返回“retval”。从服务接收值时,您的逻辑应该被移动到OnNext处理程序中,或者您应该将IObservable返回给调用者。

答案 2 :(得分:0)

返回时你正在做什么retval? 如果您需要在下次完成时进行更多处理,请在订阅的onCompleted事件中执行此操作