这是否是反应性扩展的良好候选者?

时间:2017-01-13 14:47:39

标签: c# system.reactive

我有一个我需要提高性能的过程。

此过程在数据库中运行查询。

对于每条记录,根据记录中的数据,可能需要完成2项任务。

对于这两项任务中的一项,可能需要从Web服务获取其他信息,然后处理完全相同。

另一项任务始终相同。

完成这两项任务后,必须在数据库中更新记录。

我认为Rx可以允许我并行运行进程,从而提高性能。此外,我希望能够监控批次的进度。

目前,我有以下代码。我想知道这是否是这项任务的有效方法。

IObservable<Record> records = GetDataFromDb().ToObservable();

var recsOfType1 = records.Where(r => r.IsOfType1).Do(FetchAdditionalInfoIntoRecord);
var recsOfType2 = records.Where(r => r.IsOfType2);

var allCompleteRecords = recsOfType1.Merge(recsOfType2);

allCompleteRecords.Do(Task1).Do(Task2).Do(UpdateInDB);

我需要添加额外的错误处理和监控过程。我不是100%肯定我会如何接近它。

欢迎任何想法/评论/评论。

由于

2 个答案:

答案 0 :(得分:1)

正如所提到的评论,Rx最适合基于推送的流。所有这些任务都是基于拉动的。如果您觉得标准任务没有删除它,那么我会建议TPL-Dataflow

答案 1 :(得分:1)

数据库查询,文件,注册表等基于拉取(可枚举)而不是基于推送(Observable)。您可以使用Interactive Extensions(System.Interactive)代替Reactive Extensions,它们包含Rx中的大多数等效方法,但它们是基于拉式的。

可枚举的生成器允许您编写协同例程(通过yield),并且是一个功能强大的组合工具。如果您想要异步,只需将枚举包装在Tasks中即可。