同步多个可观察流

时间:2012-10-29 14:25:11

标签: .net system.reactive

我很擅长使用Reactive Extensions,所以这可能是一个新手问题,但我有以下情况:

我从数据库中获取3个IEnumerable列表(不同类型)并填充视图模型。然而,我想协调订阅以在所有列表完成加载时触发某些内容。这是可能的Reactive Extensions还是我在以错误的方式思考?代码就像这样:

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);

2 个答案:

答案 0 :(得分: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 :(得分: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);
    }