1

誰かが次の問題についてアドバイスを提供できるかどうか疑問に思っていました。現在、RIA .NET サービスに基づく Silverlight 4 アプリケーションを開発しています。アプリケーションの画面の 1 つで、ユーザーは検索文字列を入力できます。非アクティブ状態が 2 秒間続くと、リクエストがドメイン サービスに送信されます。これはすべて Rx で適切に処理されます。

現在、元の検索が返される前に 2 番目の検索を実行することが可能です。2 番目のリクエストが最初のリクエストより前に返される可能性もあります。

本当に私は、正しい要求に対する正しい応答を管理するために人々が使用しているパターンとアプローチを見つけようとしています。

リクエストで何らかの操作識別子を使用していますか? リクエストごとにドメイン サービスの新しいインスタンスを作成していますか? リクエストの完了イベントを、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>>-はい、ネストされたオブザーバブルです。

newが入ると、クエリは受信した検索テキストから作成されsearchTextた new を返します。IObservable<Result>次に、この最新のオブザーバブルを使用するようにオブザーバブルをSwitch切り替え、results以前に作成されたオブザーバブルを無視します。

その結果、最新の検索結果のみが監視され、以前の結果は無視されます。

うまくいけば、それは理にかなっています。:-)

于 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/

特にあなたの場合、役立つ余分なものがたくさんあります.Dynamic Objectsとobservable object propsはあなたの人生を楽にするものかもしれません.

于 2012-03-07T00:59:58.513 に答える
0

IMO の最も簡単な方法は、リクエストが WCF にディスパッチされる前に通知するリクエストのサブジェクトを持つことです。次に、完了したイベントから作成されたオブザーバブルにサブスクライブするのではなく、サブスクライブしCompletedEventObservable.TakeUntil(RequestsSubject)ます。このようにして、前のリクエストへの応答が通知されることはありません。

于 2010-10-20T21:14:47.897 に答える