2

私はReactiveExtensionsを使用するのはまったく新しいので、これは初心者の質問かもしれませんが、次のシナリオがあります。

データベースから(さまざまなタイプの)3つのIEnumerableリストをフェッチし、ビューモデルにデータを入力します。ただし、すべてのリストの読み込みが完了したときに何かをトリガーするようにサブスクリプションを調整したいと思います。これはReactiveExtensionsで可能ですか、それとも間違った方法で考えていますか?次のようなコードロック:

GetCustomers()
    .ToObservable(Scheduler.Default)
    .Buffer(20).ObserveOn(SynchronizationContext.Current)
    .Subscribe(View.Model.AddRange);
GetCountries()
    .ToObservable(Scheduler.Default)
    .Buffer(20).ObserveOn(SynchronizationContext.Current)
    .Subscribe(View.Model.AddRange);
GetTransports()
    .ToObservable(Scheduler.Default)
    .Buffer(20).ObserveOn(SynchronizationContext.Current)
    .Subscribe(View.Model.AddRange);
4

2 に答える 2

3

監視可能な結合を使用してみることができます。このようなもの:

var plan =
    Observable.Start(() => GetCountries())
        .And(Observable.Start(() => GetCustomers()))
        .And(Observable.Start(() => GetTransports()))
        .Then((countries, customers, transports)
            => new { countries, customers, transports });

var query =
    Observable.When(new [] { plan });

query
    .Subscribe(cct =>
    {
        View.Model.AddRange(cct.countries);
        View.Model.AddRange(cct.customers);
        View.Model.AddRange(cct.transports);
    });

並行して実行され、最後にすべての結果が 1 つにまとめられます。

于 2012-10-30T00:59:46.427 に答える
0

すでに同期している Enumerable を Observable に変更する理由はわかりませんが、Rx イディオムでは次のことができます。

Observable.Merge(Add(GetCustomers()), Add(GetCountries())..., Add(GetTransports()))
           .Subscribe(() => { }, Completed);

Add は次のようになります。

    private IObservable<Unit> Add<T>(IObservable<T> o)
    {
        return o.Buffer(20)
                .ObserveOn(SynchronizationContext.Current)
                .Do(View.Model.AddRange)
                .Select(_ => Unit.Default);
    }
于 2012-10-29T16:02:09.257 に答える