我正在使用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来解决这个问题吗?
谢谢, 保罗
答案 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。