Solo quiero aprender ambos y cómo usarlos juntos. Entiendo que pueden complementarse entre sí. Simplemente no pude encontrar un ejemplo de alguien que realmente lo esté haciendo.TPL Dataflow y Rx Ejemplo combinado
Respuesta
Permítanme comenzar con un poco de antecedentes.
El marco .NET tiene una serie de tipos especiales - clases o interfaces adecuadas - Task<T>
, IObservable<T>
, Nullable<T>
, IEnumerable<T>
, Lazy<T>
, etc - que proporcionan poderes especiales al tipo subyacente T
.
El TPL usa Task<T>
para representar el cálculo asincrónico de un único valor de T
.
Rx usa IObservable<T>
para representar el cálculo asincrónico de cero o más valores de T
.
Es el aspecto de "cálculo asincrónico" de ambos los que unen TPL y Rx.
Ahora, el TPL también utiliza el tipo Task
para representar la ejecución asíncrona de un lambda Action
, pero esto puede ser considerado como un caso especial de Task<T>
donde T
es void
. Muy parecido a un método estándar en C# vuelve void
así:
public void MyMethod() { }
Rx también permite el mismo caso especial con el uso de un tipo especial llamado Unit
.
La diferencia entre TPL y Rx está en el número de valores devueltos. TPL es uno y solo uno, mientras que Rx es cero o más.
Por lo tanto, si trata el Rx de una manera especial trabajando solo con secuencias observables que devuelven un valor único, puede hacer algunos cálculos de forma similar al TPL.
Por ejemplo, en el TPL podría escribir:
Task.Factory
.StartNew(() => "Hello")
.ContinueWith(t => Console.WriteLine(t.Result));
Y en Rx el equivalente sería:
Observable
.Start(() => "Hello")
.Subscribe(x => Console.WriteLine(x));
Me podría dar un paso más en la Rx especificando que el TPL debe ser utilizado para ejecutar el cálculo de este modo: (. Por defecto se utiliza el grupo de subprocesos)
Observable
.Start(() => "Hello", Scheduler.TaskPool)
.Subscribe(x => Console.WriteLine(x));
Ahora podría hacer algo de "mezclar y combinar". Si agrego una referencia al espacio de nombre System.Reactive.Threading.Tasks
, puedo moverme entre las tareas y los observables con bastante facilidad.
Task.Factory
.StartNew(() => "Hello")
.ToObservable()
.Subscribe(x => Console.WriteLine(x));
Observable
.Start(() => "Hello")
.ToTask()
.ContinueWith(t => Console.WriteLine(t.Result));
Aviso los ToObservable()
& .ToTask()
llamadas y la consiguiente voltea de una biblioteca a la otra.
Si tengo un observable que devuelve más de un valor, puedo usar el método de extensión observable .ToArray()
para convertir múltiples valores de secuencia en un solo valor de matriz que se puede convertir en una tarea.Como tal:
Observable
.Interval(TimeSpan.FromSeconds(1.0))
.Take(5) // is IObservable<long>
.ToArray()
.ToTask() // is Task<long[]>
.ContinueWith(t => Console.WriteLine(t.Result.Length));
Creo que esta es una respuesta bastante básica a su pregunta. ¿Es lo que estabas esperando?
TPL Dataflow es una biblioteca muy diferente de TPL, por lo que no creo que la respuesta no aborde la pregunta de forma precisa. La discusión fue, sin embargo, notable, así que +1. – GregC
Lástima que el sistema de tipo .Net no permita la 'Tarea
Lo siento, pero como dijo GregC antes, necesito un ejemplo en el que TPL Dataflow no sea "solo" TPL. Lo que quiero es combinar bloques TPL Dataflow y con Rx. – naeron84
- 1. ¿Es este un trabajo para TPL Dataflow?
- 2. TPL vs Reactive Framework
- 3. TPL y Exception Handling
- 4. ¿Cuáles son los casos de uso de TPL flujo de datos sobre extensiones reactivas (Rx)
- 5. ¿Cómo funciona realmente SSIS Dataflow?
- 6. TPL manejo
- 7. Integración de Magento DataFlow y Recursos de desarrollo de módulos?
- 8. Rx corrientes
- 9. Seleccione Muchos en Rx
- 10. Demora y deduplicación con Reactive Extensions (Rx)
- 11. TPL - Diferencia entre MaxDegreeOfParallelism y MaximumConcurrencyLevel
- 12. Rx Let función
- 13. 101 Rx Ejemplos
- 14. Multitarea cooperativa usando TPL
- 15. Administración de TPL Queue
- 16. IConnectableObservables en Rx
- 17. Extensiones reactivas (Rx) + MVVM =?
- 18. TPL architectural question
- 19. Error en TPL - TaskContinuationOptions.ExecuteSynchronously?
- 20. Rx: EnumerableEx.For() vs Enumerable.SelectMany()
- 21. ¿Reactivarán las Extensiones reactivas (Rx) la Biblioteca de tareas paralelas?
- 22. ¿Existe este idioma TPL?
- 23. Tareas máximas en TPL?
- 24. Enhebrado, CultureInfo .net, TPL, PLINQ
- 25. manejo de excepción en Tpl
- 26. RX Scheduler - ¿Qué es eso?
- 27. RX Temas: ¿se deben evitar?
- 28. ¿Cómo cancelo/cancelo tareas TPL?
- 29. .NET 4.5 Async vs. TPL
- 30. Uso de las expresiones de programación de Clojure DataFlow
SO es lo mejor para preguntas específicas sobre cómo hacer algo. "Dame un ejemplo de X" no encaja muy bien. – svick
Ok, tienes razón sobre la forma de la pregunta, pero creo que el problema sigue siendo válido. Tal vez "¿Cómo usarlos en combinación para explotar de manera efectiva las características de ambos?" es mas apropiado – naeron84
@ naeron84 ¿Sería suficiente mirar un ejemplo combinado de C# -async + Rx? – GregC