我一直在努力弄清楚如何使用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;
}
答案 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事件中执行此操作