如何使用Rx简单地调用asyc WCF服务方法
我一直在努力弄清楚如何使用Rx。大多数示例都已过时、引用开始/结束或冗长而复杂 我有一个简单的WCF服务方法,它接受int并返回JobMaster对象 我现在是这样称呼它的:如何使用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); }
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事件中进行处理谢谢-为我指明了正确的方向。现在大部分的路都到了。但订阅失败(请参阅更新)。有什么想法吗?不知道你的意思。如果可能的话,你可以把我的代码重新写一下,看看问题出在哪里。