我想知道是否有人可以就以下问题提供一些建议。我们目前正在开发基于RIA .NET服务的Silverlight 4应用程序。应用程序中的一个屏幕允许用户键入搜索字符串,在2秒不活动后,请求将提交给我们的域服务。所有这些都可以很好地处理Rx。
现在可以在原始文件返回之前执行第二次搜索。第二个请求也可能在第一个请求之前返回。
真的,我只想找出人们用来管理正确请求的正确响应的模式和方法。
您是否在请求中使用某种操作标识符? 您是否为每个请求创建域服务的新实例? 有没有把完成的请求事件绑定到Rx observable监视textchange事件?
任何操舵都会非常有用,
戴夫
答案 0 :(得分:2)
你应该很容易解决这个问题。
如果我假设您有一个可观察的字符串来启动搜索,并且您有一个域服务,在给定字符串时会返回Result
对象,那么这就是您需要的代码类型:
IObservable<string> searchText
= ...;
Func<string, IObservable<Result>> searchRequest
= Observable.FromAsyncPattern<string, Result>(
search.BeginInvoke,
search.EndInvoke);
IObservable<Result> results
= (from st in searchText
select searchRequest(st))
.Switch();
神奇的是Switch
扩展方法,它“切换”到IObservable<IObservable<Result>>
返回的最新observable - 是的,它是一个嵌套的observable。
当新的searchText
进入时,查询会返回从传入的搜索文本创建的新IObservable<Result>
。 Switch
然后切换results
observable以使用这个最新的observable,并忽略任何先前创建的observable。
结果是只观察到最新的搜索结果,并且忽略了之前的所有结果。
希望这是有道理的。 : - )
答案 1 :(得分:1)
Erik Meijer在这里解决了这个问题(约30分钟后):http://channel9.msdn.com/Events/MIX/MIX10/FTL01 他在大约36分钟后解释了Switch声明。
答案 2 :(得分:0)
IMO的简单方法是在将任何请求分派给WCF之前通知您通知的请求主题。然后,而不是订阅从已完成的事件创建的observable订阅CompletedEventObservable.TakeUntil(RequestsSubject)
。这样,您将永远不会收到对先前请求的响应的通知。
答案 3 :(得分:0)
查看rxx http://rxx.codeplex.com/
它有大量额外的东西,这将有所帮助,特别是在你的情况下,我认为动态对象和可观察的对象道具可能会让你的生活更轻松。