我有一个我需要提高性能的过程。
此过程在数据库中运行查询。
对于每条记录,根据记录中的数据,可能需要完成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%肯定我会如何接近它。
欢迎任何想法/评论/评论。
由于
答案 0 :(得分:1)
正如所提到的评论,Rx最适合基于推送的流。所有这些任务都是基于拉动的。如果您觉得标准任务没有删除它,那么我会建议TPL-Dataflow。
答案 1 :(得分:1)
数据库查询,文件,注册表等基于拉取(可枚举)而不是基于推送(Observable)。您可以使用Interactive Extensions(System.Interactive
)代替Reactive Extensions,它们包含Rx中的大多数等效方法,但它们是基于拉式的。
可枚举的生成器允许您编写协同例程(通过yield
),并且是一个功能强大的组合工具。如果您想要异步,只需将枚举包装在Tasks中即可。