大佬教程收集整理的这篇文章主要介绍了使用Rx简化异步Silverlight Web服务请求,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
public IObservable<XElement> GetReport(String reportName) { return from client in Observable.Return(new WebserviceClient()) from request in Observable.ToAsync<String>(client.GetReportDataAsynC)(reportName) from result in Observable.FromEvent<GetReportDataCompletedEventArgs>(client,"GetReportDataCompleted").Take(1) from close in this.CloseClient(client) SELEct result.EventArgs.Result; }
我认为问题是由于Web服务被调用并在订阅已完成的事件之前返回.我无法弄清楚如何让Rx在异步调用之前订阅该事件.我试过StartWith,但这需要输入和输出类型相同,任何想法?
例如
public IObservable<XElement> GetReport(String reportName) { return from client in Observable.Return(new WebserviceClient()) from completed in Observable.CreateWithDisposable<GetReportDataCompletedEventArgs>(observer => { var subscription = Observable.FromEvent<GetReportDataCompletedEventArgs>(client,"GetReportDataCompleted") .Take(1) .SELEct(e => e.EventArgs) .Subscribe(observer); client.GetReportDataAsync(reportName); return subscription; }) from close in this.CloseClient(client) SELEct completed.Result; }
为了使这更容易使用,我将CreateWithDisposable重构为一个可以与我的所有Web服务调用一起使用的公共函数,包括从事件args类型自动确定事件名称:
private IObservable<T> Callservice<T>(ICommunicationObject serviceClient,Action start) where T : AsyncCompletedEventArgs { if (typeof(T) == typeof(AsyncCompletedEventArgs)) { throw new InvalidoperationException("Event arguments type cAnnot be used to determine event name,use event name overload instead."); } String completedEventName = typeof(T).Name.TrimEnd("EventArgs"); return Callservice<T>(serviceClient,start,completedEventName); } private IObservable<T> Callservice<T>(ICommunicationObject serviceClient,Action start,String completedEventName) where T : AsyncCompletedEventArgs { return Observable.CreateWithDisposable<T>(observer => { var subscription = Observable.FromEvent<T>(serviceClient,completedEventName).Take(1).SELEct(e => e.EventArgs).Subscribe(observer); start(); return subscription; }); } // Example usage: public IObservable<XElement> GetReport(String reportName) { return from client in Observable.Return(new WebserviceClient()) from completed in this.Callservice<GetReportDataCompletedEventArgs>(client,() => client.GetReportDataAsync(reportName)) from close in this.CloseClient(client) SELEct completed.Result; } /// <sumMary> /// Asynchronously closes the web service client /// </sumMary> /// <param name="client">The web service client to be closed.</param> /// <returns>Returns a cold observable sequence of a single success Unit.</returns> private IObservable<AsyncCompletedEventArgs> CloseClient(WebserviceClient client) { return this.Callservice<AsyncCompletedEventArgs>(client,client.CloseAsync,"CloseCompleted"); }
希望这有助于其他人!
以上是大佬教程为你收集整理的使用Rx简化异步Silverlight Web服务请求全部内容,希望文章能够帮你解决使用Rx简化异步Silverlight Web服务请求所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。