2011-07-21 17 views
5

私はRxを読んでいると思います。特定のサービスを非同期に6回呼び出す必要があるSilverlightアプリケーションがあります。昔は、呼び出しを行い、userState/tokenを照会することで、要求との応答が一致するようにしました。これらの呼び出しは、呼び出された順に返されることは保証されていないからです。しかし、私はRxがはるかにエレガントな方法でこれを処理すると思われます。しかし、私はそれを働かせることはできません。私がこれまで持っているものここで私はあなたが私がここで達成しようとしているかを見ることができると思いSilverlightとReactive Extensionsを使用した非同期サービスコールの管理

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というの存在のすべてです...です返される最初の呼び出しの結果に設定されます。

私はそれが愚かなものだと確信していますが、私はまだそれを理解することができませんでした。

感謝:)

答えて

4

ではなくObservable.FromEventPatternのObservable.FromAsyncPatternをしようと考えてみましょう。 BeginInvoke/EndInvokeのペアは、サービスプロキシによって直接公開されないため、Silverlight(および電話)でFromAsyncPatternを使用するトリックがあります。あなたはサービスプロキシではなく、サービスプロキシ自体のためのインターフェースを使用している場合しかし、あなたは開始/終了パターンにアクセスすることができます。

IMyService svc = new myServiceClient(); 
var svcObservable = Observable.FromAsyncPattern<T, MyServiceResultArgs> 
         (svc.BeginMyServiceMethod, svc.EndMyServiceMethod); 

さて、あなたはforeachの(LINQとアンチパターン)を使用してから切り替えることができます

var requestResult = from myItem in myCollection.ToObservable() 
        from result in svcObservable(myItem) 
        select new {myItem, result}; 

requestResult.Subscribe(result => result.myItem.myProperty = result.result); 

注意の1つの追加の単語:あなたはSilverlightでこの方法をFromAsyncPatternを使用する場合は、結果が背景に戻ってくるだろうし、次のようにmyCollectionとサービス要求の間で観測可能とSelectManyにあなたのmyCollectionを作成します糸。ディスパッチャーにテオ代理人を気遣う必要があります。

これを実際に見たい場合は、私のミックスプレゼンテーションの最後の20分程度をhttp://channel9.msdn.com/events/MIX/MIX11/EXT08にチェックしてください。

+0

ありがとうございました!これはうまく動作し、起動するために素晴らしいです:-)私はUIスレッドに結果をマーシャリングするために、最後の行をrequestResult.ObserveOn(SynchronizationContext.Current)に変更することはできません.Subscribe(...) ? – Senkwe

+0

ObserveOnではYesです。また、適切なSystem.Reactive.???.Threadingライブラリへの参照を追加すると、requestResult.ObserveOnDispatcher()を使用することができます。Subscribe(...) –

+0

大きな回答 - Jimが間接的にクエリ構文を使用するため、キーSelectManyを使用してリクエストを発行する –

関連する問題