2010-02-19 27 views
5

Estoy jugando con Rx en .Net3.5SP1 y probando el 101 Rx Samples. Estoy probando el primer ejemplo (Inicio - Ejecutar código de forma asíncrona) pero parece que realmente no se ejecuta de forma asíncrona. Por ejemplo,Rx en .Net 3.5 no asincrónico?

 Console.WriteLine("[Creating]"); 
     var o = Observable.Start(() => 
     { 
      Console.WriteLine("Calculating..."); 
      Thread.Sleep(3000); 
      Console.WriteLine("Done."); 
     }); 
     Console.WriteLine("[Created]"); 
     Console.WriteLine("[Starting]"); 
     o.First(); // subscribe and wait for completion of background operation 
     Console.WriteLine("[Started]"); 

salidas

[Creating] 
[Created] 
[Starting] 
Calculating... 
    <...3 Second Wait...> 
Done. 
[Started] 

¿Existe una explicación para esto? ¿Estoy haciendo algo mal? ¿Es este comportamiento esperado?

ACTUALIZACIÓN

yo habría pensado que habría dicho

[Creating] 
[Created] 
[Starting] 
Calculating... 
[Started] 
    <...3 Second Wait...> 
Done. 

Pero el hilo principal está bloqueada mientras la llamada supuestamente Asynch sucede.

Respuesta

1

Eso se ve razonablemente esperado para mí.

Si coloca una llamada Thread.Sleep entre "Creado" y "Comenzando", creo que verá aparecer la línea "Cálculo", que muestra que está trabajando mientras se está ejecutando el hilo principal. Esa es la forma en que es asincrónico.

Si le preocupa porque First() devuelve el valor en sí, en lugar de dar un tipo de valor "futuro" que puede consultar más adelante, esa es una cuestión diferente, y tengo dos publicaciones de blog para leer: part 1; part 2. Creo que quiere el método Prune, pero no estoy del todo seguro.

+0

Sin ese no es el problema ... el tema es la secuencia de eventos. Yo hubiera pensado que habría dicho [Crear] [Creado] [Arranque] Calculando ... [Iniciado] <3 ... En segundo lugar, espere ...> Listo. Pero el hilo principal está bloqueado mientras ocurre la supuesta llamada Asynch ... –

+0

@kouPhax: El método First() tiene que * devolver * el valor, ¿no? (Es cierto que el valor es simplemente 'Unidad 'en este caso, pero aún así ...) Esto significa que no puede completarse hasta * después * de que el cálculo haya finalizado. Básicamente, el cálculo * está * pasando de forma asíncrona, pero la llamada Primera() espera a que se complete. El comentario dice explícitamente que: "// suscribirse y esperar la finalización de la operación de fondo" –

+0

¡Ja! ¡Supongamos que aprenda a leer! Gracias –

1

La línea // subscribe and wait for completion of background operation dice que espera a que finalice la operación en segundo plano. Entonces, no esperaría que el código que sigue esa línea (Console.WriteLine("[Started]");) se ejecute hasta que se complete la operación, ¿verdad?

1

En primer lugar está bloqueando ... Suscribirse es lo que quiere:

 public static void Main(string[] args) { 

     Console.WriteLine("[Creating]"); 
     var o = Observable.Start(() => 
     { 
      Console.WriteLine("Calculating..."); 
      Thread.Sleep(3000); 

     }); 
     Console.WriteLine("[Created]"); 
     Console.WriteLine("[Starting]"); 

     o.Subscribe(_ => Console.WriteLine("Done.")); // subscribe and wait for completion of background operation 

     Console.WriteLine("[Started]"); 

     Console.ReadKey(); 
    }