Rx in .net 3.5 nicht asynchron?
-
21-09-2019 - |
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.
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();
}