Как создать истинный конвейер функции с использованием C#? Я получил некоторое представление о том, как как следует, но это не истинный трубопроводКак реализовать истинный конвейер функции в C#?
public static IEnumerable<T> ForEachPipeline<T>(this IEnumerable<T> source, params Func<T, T>[] pipeline)
{
foreach (var element in source) {
yield return ExecutePipeline(element, pipeline);
}
}
private static T ExecutePipeline<T>(T element, IEnumerable<Func<T, T>> jobs)
{
var arg = element;
T result = default(T);
foreach (var job in jobs) {
result = job.Invoke(arg);
arg = result;
}
return result;
}
В приведенном выше коде каждый элемент IEnumerable<T>
бы смог попасть в трубопровод только после того, как предыдущий элемент заканчивается выполнение всех функций (то есть выходы конвейер), но в соответствии с определением, если element1
завершает выполнение func1
и начинает выполнение func2
, к этому времени element2
должен начать выполнение func1
и т. д., тем самым сохраняя продолжающийся поток данных в конвейере.
Можно ли реализовать такой сценарий на C#? Если возможно, пожалуйста, дайте мне примерный код.
Существует только один контекст выполнения, если не введены потоки (альтернативный подход с одним потоком - это просто нелогичное построение результата на каждом шаге). С потоками каждый этап представляет собой только очередь FIFO, передающую сообщения вокруг «насоса». Темы (фактически, параллелизм) также значительно увеличивают сложность, возможно, см. Методы .NET4 «Parallel». – 2010-11-13 17:28:04
У меня нет проблем с введением потоков, мне нужно, чтобы все было сделано. Пожалуйста, поделитесь некоторыми идеями. –
Разве PLINQ не решит это? http://msdn.microsoft.com/en-us/library/dd460688.aspx – bzlm