我有一段代码可以对资产进行计算.有数百万,所以我想在流中计算所有内容.我目前的'管道'看起来像这样:
我有一个作为Datareader执行的查询.
然后我的Asset类有一个接受IDataReader的构造函数;
Public Asset(IdataReader rdr){
// logic that initiates fields
}
Run Code Online (Sandbox Code Playgroud)
以及将IDataReader转换为IEnumerable <Asset>的方法
public static IEnumerable<Asset> ToAssets(IDataReader rdr) {
// make sure the reader is in the right formt
CheckReaderFormat(rdr);
// project reader into IEnumeable<Asset>
while (rdr.Read()) yield return new Asset(rdr);
}
Run Code Online (Sandbox Code Playgroud)
然后将其传递给执行实际计算的函数,然后将其投影到IEnumerable <Asnwer>中
然后得到一个包装器将Answers公开为IDataReader,然后将其传递给OracleBulkCopy并将流写入数据库.
到目前为止它的工作就像一个魅力.由于设置,我可以将DataReader交换为从文件读取的IEnumerable,或将结果写入文件等.所有这些都取决于我如何将类/函数串在一起.
现在:有几件事我可以计算,例如除了正常的答案我可以有一个DebugAnswer类,它也输出一些中间数字进行调试.所以我想做的是将IEnumerable投影到几个输出流中,这样我就可以把'听众'放在那些上.这样我就不必多次查看数据了.我怎样才能做到这一点?有点像有几个事件,然后只有附加了一个听众才会触发某些代码.
有时我也会写入数据库,但也会写入zip文件,以保留结果的备份.那么我想在IEnumerable上有2个'听众'.一个项目是IDataReader,另一个项目直接写入文件.
如何输出多个输出流以及如何在一个输出流上放置多个侦听器?是什么让我组合这样的数据流?
编辑
所以我想做的一些伪代码:
foreach(Asset in Assets){
if(DebugListener != null){
// compute
DebugAnswer da = new DebugAnswer {result = 100};
yield da to DebugListener; // so instead of yield return yield to that stream
}
if(AnswerListener != null){
// compute basic stuff
Answer a = new Answer { bla = 200 };
yield a to AnswerListener;
}
}
Run Code Online (Sandbox Code Playgroud)
提前致谢,
格特 - 扬
您所描述的内容听起来有点像Reactive框架通过IObservable接口提供的内容,但我不确定它是否允许多个订阅者使用单个订阅流.
如果您查看文档IObservable,它有一个非常好的示例,说明如何执行您正在执行的操作,具有单个对象的多个订阅者.
| 归档时间: |
|
| 查看次数: |
747 次 |
| 最近记录: |