У меня есть кусок кода, который выполняет расчеты по активам.Их много миллионов, поэтому я хочу вычислить все в потоках.Мой текущий «конвейер» выглядит так:
У меня есть запрос, который выполняется как Datareader.
Тогда в моем классе активов есть конструктор, который принимает IDataReader;
Public Asset(IdataReader rdr){
// logic that initiates fields
}
, и метод, который преобразует IDataReader в IEnumerable
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);
}
Этозатем передается в функцию, которая выполняет фактические вычисления, а затем проецирует ее в IEnumerable
, который затем получает обертку, выставляет ответы в качестве IDataReader и затем передается в OracleBulkCopy ипоток записывается в БД.
Пока что это работает как шарм.Из-за настройки я могу поменять DataReader на IEnumerable, который читает из файла, или записать результаты в файл и т. Д. Все в зависимости от того, как я связываю классы / функции вместе.
Теперь: есть несколько вещей, которые я могу вычислить, например, помимо обычного ответа, у меня может быть класс DebugAnswer, который также выводит некоторые промежуточные числа для отладки.Итак, я хотел бы проецировать IEnumerable в несколько потоков вывода, чтобы я мог добавить к ним «слушателей».Таким образом, мне не придется просматривать данные несколько раз.Как я могу это сделать?Вроде как иметь несколько Событий, а затем запускать определенный код, только если подключены слушатели.
Также иногда я пишу в БД, а также в zip-файл, чтобы сохранить резервную копию результатов.Итак, я хотел бы иметь 2 'слушателей' на IEnumerable.Один, который проецируется как IDataReader, а другой, который записывает прямо в файл.
Как вывести несколько выходных потоков и как разместить несколько прослушивателей в одном выходном потоке?Что позволяет мне составлять потоки таких данных?
edit
поэтому какой-то псевдокод того, что я хотел бы сделать:
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;
}
}
Заранее спасибо,
Gert* 1034-январь *