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 个“开始” ——当且仅当您可以保证计算没有副作用时。
编辑:请参阅评论。
| 归档时间: |
|
| 查看次数: |
3840 次 |
| 最近记录: |