如何在C#中实现真正的函数管道?

Ani*_*jee 5 .net c# ienumerable pipeline

如何使用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;
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,每个元素IEnumerable<T>只有在前一个元素完成执行所有函数(即退出管道)之后才能进入管道,但是根据定义,如果element1完成执行func1并开始执行func2,到那时element2应该开始执行func1并且这样就维持了管道中数据的持续流动.

这种情况是否可以在C#中实现?如果可能的话请给我一些示例代码.

小智 0

来自评论:除非引入线程,否则只有一个执行上下文(单线程的替代方法只是在每个步骤中构建非惰性结果)。对于线程,每个阶段只是一个 FIFO 队列,围绕“泵”传递消息。线程(实际上是并发)也大大增加了复杂性,也许可以参见.NET4“并行”方法。

一个“简单”的方法就是使用Parallel.ForEach配置 N 个“开始” ——当且仅当您可以保证计算没有副作用时。

编辑:请参阅评论。