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

如何使用Rx简单地调用asyc WCF服务方法,wcf,system.reactive,Wcf,System.reactive,我一直在努力弄清楚如何使用Rx。大多数示例都已过时、引用开始/结束或冗长而复杂 我有一个简单的WCF服务方法,它接受int并返回JobMaster对象 我现在是这样称呼它的: public static void GetJob(int jobId) { KernServiceClient.GetJobCompleted += GetJobCompleted; KernServiceClient.GetJobAsync(jobId); }

我一直在努力弄清楚如何使用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;
    }
publicstaticjobmastergetjob(int-jobId)
{
JobMaster retval=null;
IKernService kernServiceInterface=KernServiceClient;
var getJobFunc=Observable.FromAsyncPattern(
kernServiceInterface.BeginGetJob、kernServiceInterface.EndGetJob);
var结果=getJobFunc(jobId);
结果
订阅
(
onNext:x=>retval=ConvertJobMaster(x),
onError:ex=>ShowError(ex.Message)
);
返回返回;
}
//忽略ReactiveXaml部分


小结:将KernServiceClient强制转换到它实现的接口以获取开始/结束方法,使用FromAsyncPattern。

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

返回时,您使用retval做什么?
如果您需要在“下一步”完成时进行更多处理,请在订阅的onCompleted事件中进行处理

谢谢-为我指明了正确的方向。现在大部分的路都到了。但订阅失败(请参阅更新)。有什么想法吗?不知道你的意思。如果可能的话,你可以把我的代码重新写一下,看看问题出在哪里。