
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管理异步服务调用所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)