Domanda

sto giocando con Rx in .Net3.5SP1 e cercando il 101 Rx campioni . Sto cercando il primo campione (Start - Esegui codice in modo asincrono), ma non sembra funzionare in realtà in modo asincrono. Ad esempio,

        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]");

Uscite

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

C'è una spiegazione per questo? Sto facendo qualcosa di sbagliato? È questo comportamento previsto?

UPDATE

avrei pensato che avrebbe detto

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

Ma il filo principale viene bloccato mentre la chiamata presumibilmente Asynch accade.

È stato utile?

Soluzione

Che sembra ragionevolmente prevedere per me.

Se si mette una chiamata Thread.Sleep tra "Creato" e "Avvio" Penso che vedrete apparire la linea "Calcolo", dimostrando che sta facendo il lavoro mentre il thread principale è in esecuzione. Questo è il modo in cui è asincrona.

Se sei preoccupato perché First() restituisce il valore in sé, piuttosto che dare una sorta di valore "futuro" è possibile consultare in seguito, questo è un altro discorso - e ho due post sul blog per voi a leggere: parte 1 ; parte 2 . I pensare si desidera il metodo Prune, ma io non sono del tutto sicuro.

Altri suggerimenti

La // subscribe and wait for completion of background operation riga dice che attende per l'operazione di sfondo per il completamento. Quindi non ci si aspetterebbe il seguente codice che la linea (Console.WriteLine("[Started]");) per l'esecuzione fino al completamento dell'operazione, giusto?

In primo luogo sta bloccando ... Sottoscrivi è ciò che si vuole:

        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();
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top