RX来管理和加入n个子进程

时间:2013-11-28 23:08:53

标签: system.reactive reactive-programming

我正在使用RX来合并并行进程,这些进程本身由RX管理(通过MassTransit工作流程)。

任务是启动多个进程,一旦它们全部返回,然后继续。

因此,对于4个流程,我目前有以下功能完美无缺:

IObservable<ExportServiceResult> one = ExecuteExport(campaignId, "Export1");
IObservable<ExportServiceResult> two = ExecuteExport(campaignId, "Export2");
IObservable<ExportServiceResult> three = ExecuteExport(campaignId, "Export3");
IObservable<ExportServiceResult> four = ExecuteExport(campaignId, "Export4");

// we need all exports to complete before we can move to the next step
var allExportsForCampaign = one
    .And(two)
    .And(three)
    .And(four)
    .Then((first, second, third, fourth) =>
    {
         var result = new ExportBatchResult();

         result.ExportResults.Add(first);
         result.ExportResults.Add(second);
         result.ExportResults.Add(third);
         result.ExportResults.Add(fourth);
         return result;
    }
);

return Observable.When(allExportsForCampaign);

在上面的内容中,ExecuteExport(2)返回一个值并完成。

理想情况下,我们希望能够将此系统配置为在配置中提供 n 导出,并动态处理。

我的问题是:可以等待 n observables返回一个值,然后继续使用某种形式的集合中可访问的值吗?

或者我是以错误的方式解决这个问题,还有另一种方法可以使用RX来解决这个问题吗?

谢谢, 保罗

2 个答案:

答案 0 :(得分:1)

您可以将observable与Merge()组合,然后聚合生成的observable。

IEnumerable<IObservable<ExportServiceResult>> observers;
IEnumerable<ExportServiceResult> result = new List<ExportServiceResult>();

var o = observers.Aggregate( (x,y) => x.Merge(y))
    .Aggregate( result, (l,x) => l.Concat( new[]{ x }));

答案 1 :(得分:1)

这是一个稍微清洁的方式:

IEnumerable<IObservable<TResult>> obs;
IList<TResult> result = Observable.Zip(obs).Wait(); 

如果您不希望它被阻止,只需忽略Wait()即可拥有IObservable<IList<TResult>>您可以订阅或撰写更多Rx。