2011-12-29 28 views
0

我一直在努力弄清楚如何使用Rx。大多数例子都过时了,参考开始/结束或者很长很复杂。我如何简单地使用Rx调用asyc WCF服务方法

我有一个简单的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 
    } 

如何改变这种使用接收?

编辑

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

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; 
    } 

回答

1

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

摘要:铸造KernServiceClient的接口它实现拿回开始/结束方法,使用FromAsyncPattern。

+0

谢谢 - 我指出了正确的方向。现在大部分路都在那里。尽管订阅失败(请参阅更新)。有任何想法吗? – 2011-12-29 20:06:46

+0

这应该工作。尝试启用第一次机会例外? – 2011-12-30 02:54:08

0

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

+0

不确定你的意思。如果可能的话,你可以拿我的代码并重写,以显示问题是什么。 – 2012-01-03 20:55:55

0

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