¿Cómo crear una tubería de función verdadera usando C#? Tengo una idea, como las siguientes, pero no es un verdadero tubería¿Cómo implementar una verdadera función de canalización en 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;
}
En el código anterior cada elemento de IEnumerable<T>
sería capaz de entrar en la tubería sólo después de que el elemento anterior termina de ejecutar todas las funciones (es decir, las salidas la tubería), pero de acuerdo con la definición si element1
termina de ejecutar func1
y empieza a ejecutar func2
, en ese momento element2
debería comenzar a ejecutar func1
y así sucesivamente, manteniendo así el flujo continuo de datos en la tubería.
¿Es posible implementar este tipo de escenario en C#? Si es posible, por favor dame un código de ejemplo.
Solo hay un único contexto de ejecución a menos que se introduzcan hilos (el enfoque alternativo con un hilo único es solo el desarrollo de resultado no perezosa en cada paso). Con los hilos, cada etapa es solo una cola FIFO que pasa mensajes alrededor de una "bomba". Los subprocesos (en realidad, concurrencia) también aumentan enormemente la complejidad, tal vez vea los métodos .NET4 "Paralelo". –
No tengo problemas para introducir hilos, necesito que el trabajo se haga de todos modos ... por favor comparta algunas ideas –
¿No resolvería esto PLINQ? http://msdn.microsoft.com/en-us/library/dd460688.aspx – bzlm