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