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

使用Silverlight和Reactive Extensions管理异步服务调用,第1张

概述所以我正在读Rx并且很难解开它.我有一个Silverlight应用程序需要异步调用6个特定服务.在过去,我们通过调用和查询userState / token来处理这个问题,以匹配响应请求,因为它们不能保证按照我们调用它们的顺序返回.但是,我怀疑Rx以更优雅的方式处理这个问题.但我无法让它发挥作用.这是我到目前为止所拥有的…… myCollection.Add(new myObject(1));m 所以我正在读Rx并且很难解开它.我有一个Silverlight应用程序需要异步调用6个特定服务.在过去,我们通过调用和查询userState / token来处理这个问题,以匹配响应请求,因为它们不能保证按照我们调用它们的顺序返回.但是,我怀疑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成为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,结果将返回后台线程.您将需要照顾teo委托给调度员.

如果你想看到这个,请查看我在http://channel9.msdn.com/events/MIX/MIX11/EXT08的Mix演示文稿的最后20分钟左右.

总结

以上是内存溢出为你收集整理的使用Silverlight和Reactive Extensions管理异步服务调用全部内容,希望文章能够帮你解决使用Silverlight和Reactive Extensions管理异步服务调用所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/1209349.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-04
下一篇2022-06-04

发表评论

登录后才能评论

评论列表(0条)

    保存