Frage

Ich spiele mit RX in .NET3.5SP1 und versuche das 101 RX -Proben. Ich versuche das erste Beispiel (starten Sie asynchron aus), aber es scheint nicht asynchron zu laufen. Zum Beispiel,

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

Ausgänge

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

Gibt es eine Erklärung dafür? Mache ich etwas falsch? Ist das erwartete Verhalten?

AKTUALISIEREN

Ich hätte gedacht, es hätte gesagt

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

Aber der Hauptfaden ist blockiert, während der angeblich asynchische Anruf auftritt.

War es hilfreich?

Lösung

Das sieht mir vernünftigerweise erwartet.

Wenn Sie eine setzen Thread.Sleep Rufen Sie zwischen "erstellt" und "Start" an. Ich denke, Sie werden sehen, dass die Zeile "Berechnen" angezeigt wird und zeigt, dass es funktioniert, während der Hauptfaden ausgeführt wird. So ist es asynchron.

Wenn Sie besorgt sind, weil First() Gibt den Wert selbst zurück, anstatt eine Art "zukünftiger" Wert zu geben, den Sie später konsultieren können, das ist eine andere Angelegenheit - und ich habe zwei Blog -Beiträge, die Sie lesen können: Teil 1; Teil 2. ich denken du willst das Prune Methode, aber ich bin mir nicht ganz sicher.

Andere Tipps

Die Linie // subscribe and wait for completion of background operation sagt, dass es darauf wartet, dass der Hintergrundvorgang abgeschlossen ist. Sie würden also nicht erwarten, dass der Code dieser Zeile folgt (Console.WriteLine("[Started]");) bis zum Abschluss der Operation zu laufen, oder?

Zunächst blockiert ... abonnieren ist das, was Sie wollen:

        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();
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top