2010-02-19 8 views
5

Ich spiele mit Rx in. Net3.5SP1 und versuche die 101 Rx Samples. Ich versuche das erste Beispiel (Start - Code asynchron ausführen), aber es scheint nicht wirklich asynchron zu laufen. Zum BeispielRx in .Net 3.5 nicht asynchron?

 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 erwartetes Verhalten?

UPDATE

ich es gesagt haben

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

Aber der Haupt-Thread blockiert wird, während die angeblich Asynch Anruf passiert wäre hätte gedacht.

Antwort

1

Das sieht vernünftigerweise zu mir erwartet.

Wenn Sie einen Thread.Sleep Anruf zwischen "Created" und "Starting" setzen, denke ich, dass die Zeile "Calculating" angezeigt wird, die zeigt, dass sie funktioniert, während der Hauptthread ausgeführt wird. So ist es asynchron.

Wenn Sie besorgt sind, weil First() den Wert selbst zurückgibt, anstatt eine Art "zukünftigen" Wert zu geben, können Sie später nachsehen, das ist eine andere Sache - und ich habe zwei Blogbeiträge für Sie zu lesen: part 1; part 2. I denke, Sie wollen die Prune Methode, aber ich bin mir nicht ganz sicher.

+0

Nein, das ist nicht das Problem ist ... die Frage der Reihenfolge der Ereignisse ist. Ich hätte gedacht, es hätte gesagt [Erstellen] [Erstellt] [Starten] berechnen ... [Gestartet] <... 3 Zweite warten ...> Fertig. Aber der Haupt-Thread ist blockiert, während der vermeintlich Asynch Anruf passiert ... –

+0

@kouPhax: Die First() -Methode muss * den Wert * aber * zurückgeben, nicht wahr? (Zugegebenermaßen ist der Wert in diesem Fall nur "Unit", aber immer noch ...) Dies bedeutet, dass er erst nach dem Abschluss der Berechnung abgeschlossen werden kann. Im Grunde läuft die Berechnung * asynchron, aber der First() - Aufruf wartet darauf, dass er abgeschlossen wird. Der Kommentar sagt explizit, dass: "// subscribe und warten auf Abschluss der Hintergrundoperation" –

+0

Ha! Angenommen, ich sollte lesen lernen! Vielen Dank –

1

Die Zeile // subscribe and wait for completion of background operation besagt, dass sie auf den Abschluss der Hintergrundoperation wartet. Sie würden also nicht erwarten, dass der Code, der dieser Zeile folgt (Console.WriteLine("[Started]");), so lange läuft, bis der Vorgang abgeschlossen ist, oder?

1

Zuerst 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(); 
    }