Rx扩展是否适合读取文件和存储到数据库

时间:2011-08-23 16:41:58

标签: entity-framework asynchronous system.reactive

我有一个很长的Excel文件,我用EPPlus读过。对于每一行,我测试它是否符合某些标准,如果是,我将该行(表示该行的对象)添加到集合中。读取文件时,我将这些对象存储到数据库中。是否有可能同时做两件事?我的想法是拥有一个对象集合,这些对象以某种方式被线程消耗,将对象保存到数据库中。同时excel reader方法将填充集合......这可以使用Rx完成还是有更好的方法?

感谢。

3 个答案:

答案 0 :(得分:2)

另一个答案 - 基于对我的第一个评论。

创建一个从EPPlus / Xls返回IEnumberable<Records>的函数 - 使用yield return 然后将seqence转换为线程池上的observable,你就拥有了生成器/消费者和BlockingCollection的Rx方式。

function IEnumberable<Records> epplusRecords() 
{
  while (...)
     yield return nextRecord;
}
var myRecords = epplusRecords
   .ToObservable(Scheduler.ThreadPool)
   .Where(rec => meetsCritera(rec))
   .Select(rec => newShape(rec))
   .Do(newRec => writeToDb(newRec))
   .ToArray();

答案 1 :(得分:1)

您的案例似乎是提取数据(IEnumerable)而不是推送数据(IObservable/Rx)。 因此,我建议LINQ to objects是可用于建模解决方案的东西。 如下面的代码所示。

publis static IEnumerable<Records> ReadRecords(string excelFile)
{
  //Read from excel file and yield values
}

//use linq operators to do filtering
var filtered = ReadRecords("fileName").Where(r => /*ur condition*/)
foreach(var r in filtered)
   WriteToDb(r);

注意:在使用IEnumerable时,您不会在这种情况下创建中间集合,整个过程看起来像一个管道。

答案 2 :(得分:0)

它看起来不太合适,因为在用例中没有固有的并发性,时间或事件。

那就是说,它可能是plinq的一个用例。如果EEPlus支持并发读取。像

这样的东西
epplusRecords
   .AsParallel()
   .Where(rec => meetsCritera(rec))
   .Select(rec => newShape(rec))
   .Do(newRec => writeToDb(newRec))
   .ToArray();