使用Silverlight和Reactive Extensions管理异步服务调用



所以我正在阅读Rx,并且很难理解它。我有一个Silverlight应用程序,需要对一个特定的服务异步调用6次。在过去,我们通过调用和查询userState/令牌来匹配响应和请求来处理这个问题,因为它们不能保证按照我们调用它们的顺序返回。然而,我怀疑Rx以一种优雅得多的方式处理这个问题。但我不能让它工作。这是我到目前为止所做的…

myCollection.Add(new myObject(1));
myCollection.Add(new myObject(2));
myCollection.Add(new myObject(3));
myCollection.Add(new myObject(4));
myCollection.Add(new myObject(5));
myCollection.Add(new myObject(6));
foreach (var myItem in myCollection)
{
    var myObservable = Observable.FromEventPattern<MyServiceMethodCompletedEventArgs>
    (
        f => myServiceClient.MyServiceMethodCompleted += f,
        f => myServiceClient.MyServiceMethodCompleted -= f
    ).Take(1).ObserveOn(SynchronizationContext.Current);
    myObservable.Subscribe
    (
    s =>
    {
        if (s.EventArgs.Error == null)
        {
        myItem.MyProperty = s.EventArgs.Result;
        }
    }
    );
    myServiceClient.MyServiceMethodAsync(myItem);
}

我希望你能看到我在这里努力实现的目标…

我最终得到的是所有的myObject被设置为第一次调用返回的结果。

我肯定这是什么愚蠢的东西,但我还没能弄明白。

谢谢:)

考虑尝试一下Observable。FromAsyncPattern代替Observable.FromEventPattern。在Silverlight(和手机)中使用FromAsyncPattern有一个技巧,因为BeginInvoke/EndInvoke对不是由服务代理直接公开的。但是,如果您使用服务代理的接口而不是服务代理本身,则可以访问开始/结束模式:

IMyService svc = new myServiceClient();
var svcObservable = Observable.FromAsyncPattern<T, MyServiceResultArgs>
                        (svc.BeginMyServiceMethod, svc.EndMyServiceMethod);
现在,你可以从使用foreach (LINQ的反模式)切换到将myCollection变成一个可观察对象,并在myCollection和服务请求之间使用SelectMany,如下所示:
var requestResult = from myItem in myCollection.ToObservable()
                    from result in svcObservable(myItem)
                    select new {myItem, result};
requestResult.Subscribe(result => result.myItem.myProperty = result.result);

一个额外的警告:如果你以这种方式在silverlight中使用FromAsyncPattern,结果将返回到一个后台线程。您需要小心地将委托返回给调度程序。

如果你想看实际操作,请在http://channel9.msdn.com/events/MIX/MIX11/EXT08查看我Mix演示的最后20分钟左右。

相关内容

  • 没有找到相关文章

最新更新