如何使用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