Rx in .Net 3.5 non asincrono?
-
21-09-2019 - |
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.
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();
}