2012-01-04 15 views
9

Las versiones anteriores de Reactive Extensions tenían un método de extensión Run and Do para IEnumerable. Ambos parecen estar haciendo exactamente lo mismo, y no estoy seguro de la diferencia.¿Cuál es la diferencia entre ejecutar y hacer en Rx?

Pregunto porque estoy actualizando un código anterior, y Do se ha movido a Ix (que todavía no está en una versión estable), y parece que Run ha sido reemplazado por ForEach.

+0

Jonathan, ¿alguna de las respuestas lo ayudó? Si es así, por favor marque como respuesta. ¡Gracias! –

+1

Para cualquiera que se pregunte, el equivalente de "Ejecutar" en las compilaciones de Rx más nuevas es el método de extensión Observable.Wait(). Este método bloquea la ejecución hasta que se reciba el valor final, o una excepción, de la fuente observable. Invocarlo provoca una suscripción. – thefellow3j

Respuesta

10

Do especifica que algunos efectos secundarios tendrán lugar cuando se ejecuten, y devuelve la secuencia con efectos secundarios.

Ejecutar enumera la secuencia y devuelve vacío.

Piénsalo de esta manera: "etiqueta" la secuencia con efectos secundarios. Esos efectos secundarios tendrán lugar solo cuando se enumere la secuencia. Devuelve la nueva secuencia con efectos secundarios.

// Example of .Do 
var elements = new[] { 1, 2, 3 }; 
var elementsWithSideEffects = elements.Do(e => MessageBox.Show(e)); // No Message Boxes shown yet! 
elementsWithSideEffects.Run(); // 3 message boxes shown 

Ejecutar, por el contrario, enumera la secuencia: Ejecutar(), u opcionalmente se une efectos secundarios, a continuación, enumera la secuencia: Ejecutar (acción)

// Example of .Run with its own side effects: 
var elements = new[] { 1, 2, 3 }; 
elements.Run(e => MessageBox.Show(e)); // 3 Message Boxes shown. 
+2

Creo que necesita un 'AsObservable()' después de las declaraciones de su matriz (de lo contrario, se ejecuta en 'IEnumerable'). –

+0

Erm, si no me equivoco, .Do y .Run son parte de las extensiones interactivas (IX), que opera en IEnumerable . –

+0

'Do' todavía está en IEnumerable e IObservable. 'Run' * fue * en ambos a partir del marco de tiempo de lanzamiento de WP7, pero ahora solo está disponible como parte de Ix. Habiendo dicho eso, ahora me doy cuenta de que el OP se estaba refiriendo a IEnumerable y no a IObservable. Disculpas por la confusión. –

8

que se pueda imaginar Do como "Peek" ya que ejecuta efectos secundarios para cada valor/error/finalización, pero no puede cambiar sus valores ya que las lambdas pasaron todos los vacíos de retorno. Es similar a Subscribe, pero no rompe la mónada ("cadena") ya que devuelve IObservable<T>. Do se usa a menudo para iniciar sesión.

Run es básicamente una versión de bloqueo de Subscribe, lo que significa que la ejecución no continúa más allá de esa línea hasta que se ha llamado a OnComplete/OnError.

+0

Brillante respuesta, esto hizo que el centavo cayera para mí. – Contango

6

Piense en Do como un amperímetro: abre el circuito (la cadena de operadores de consulta) y conecta un medidor (un delegado de acción) para la corriente (los valores que fluyen a través de los operadores de consulta). Para cada electrón (valor) que fluye a través del circuito (consulta), el medidor (acción) realiza algún trabajo. Observe que el circuito (consulta) aún está apagado (flojo). No es hasta que conecte la batería (ejecute un ciclo foreach) que la corriente (valores) está fluyendo. Una forma simple de encender el circuito (ejecutar la consulta) es usar una batería (el operador ForEach).

+0

Me gusta tu analogía pero ForEach es una carga, no una batería:) Hasta que el circuito esté abierto, no pasa nada. –

3

Actúa como otros operadores LINQ como Select o Where - no pasa nada si solo lo usas, tienes que foreach para que suceda algo. Run/ForEach/Subscribe actúa como la instrucción foreach, se ejecuta inmediatamente.

Si no está 100% claro sobre cuándo usar cada una, evite Hacer y simplemente use ForEach/Run.

Cuestiones relacionadas