1

我想知道是否有人可以就以下问题提供一些建议。我们目前正在开发基于 RIA .NET 服务的 Silverlight 4 应用程序。应用程序中的一个屏幕允许用户输入搜索字符串,并且在 2 秒不活动后,请求被提交到我们的域服务。这一切都与 Rx 很好地处理。

现在,目前可以在原始搜索返回之前执行第二次搜索。第二个请求也有可能在第一个请求之前返回。

真的,我只是想找出人们用来管理对正确请求的正确响应的模式和方法。

您是否在请求中使用了某种操作标识符?您是否为每个请求创建域服务的新实例?是否可以将请求的完成事件与监视 textchange 事件的 Rx 可观察对象联系起来?

任何指导都会很有帮助,

戴夫

4

4 回答 4

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>>对象 - 是的,它是一个嵌套的可观察对象。

当一个新的searchText进来时,查询返回一个IObservable<Result>从传入的搜索文本创建的新的。然后Switchresultsobservable 切换为使用这个最新的 observable,并忽略任何以前创建的 observable。

所以结果是只观察到最新的搜索结果,而忽略任何以前的结果。

希望这是有道理的。:-)

于 2010-11-24T10:21:07.620 回答
1

Erik Meijer 在这里(大约 30 分钟后)解决了这个问题: http: //channel9.msdn.com/Events/MIX/MIX10/FTL01 他在大约 36 分钟后解释了 Switch 语句。

于 2011-10-14T04:50:42.703 回答
0

查看 rxx http://rxx.codeplex.com/

它有很多额外的东西会有所帮助,特别是在你的情况下,我认为动态对象和可观察对象道具可能会让你的生活更轻松。

于 2012-03-07T00:59:58.513 回答
0

IMO 最简单的方法是在将任何请求分派到 WCF 之前通知请求的主题。然后,与其订阅从已完成事件创建的可观察对象,不如订阅CompletedEventObservable.TakeUntil(RequestsSubject). 这样,您将永远不会收到对先前请求的响应的通知。

于 2010-10-20T21:14:47.897 回答