如何使用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“并行”方法。 – 2010-11-13 17:28:04
我在介绍线程时没有问题,无论如何我需要做的工作..请分享一些想法 – 2010-11-13 17:30:53
PLINQ不会解决这个问题吗? http://msdn.microsoft.com/en-us/library/dd460688.aspx – bzlm 2010-11-13 17:34:33