Pregunta

Estoy jugando con Rx en .Net3.5SP1 y tratando las muestras 101 Rx . Estoy intentando la primera muestra (Inicio - Ejecutar Código de forma asíncrona), pero no parece que realmente ejecutar de forma asincrónica. Por ejemplo,

        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]

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

Actualizar

Me 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.

¿Fue útil?

Solución

que se parece razonable esperar que a mí.

Si pone una llamada entre Thread.Sleep "creada" y "Inicio" Creo que se verá aparecer la línea "Cálculo", lo que demuestra que se está haciendo el trabajo, mientras que el hilo principal está en marcha. Esa es la forma en la que es asíncrona.

Si está preocupado porque First() devuelve el valor en sí, en lugar de dar una especie de valor "futuro" puede consultar más adelante, eso es un asunto diferente - y tengo dos entradas de blog para que lea: parte 1 ; parte 2 . I Think desea que el método Prune, pero no estoy del todo seguro.

Otros consejos

El // subscribe and wait for completion of background operation línea dice que espera la operación en segundo plano a completa. Así que no es de esperar que el siguiente código de línea (Console.WriteLine("[Started]");) para ejecutar hasta que se complete la operación de la, ¿verdad?

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();
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top