Rx .Net 3.5 ne Asynchronous?
-
21-09-2019 - |
Question
Je joue avec Rx dans .Net3.5SP1 et essayer 101 échantillons Rx . Je suis en train le premier échantillon (Démarrer - Exécuter le code de manière asynchrone), mais il ne semble pas courir en fait de manière asynchrone. Par exemple,
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]");
Sorties
[Creating]
[Created]
[Starting]
Calculating...
<...3 Second Wait...>
Done.
[Started]
Y at-il une explication à cela? Est-ce que je fais quelque chose de mal? Est-ce comportement attendu?
UPDATE
J'aurais pensé qu'il aurait dit
[Creating]
[Created]
[Starting]
Calculating...
[Started]
<...3 Second Wait...>
Done.
Mais le fil conducteur est bloqué alors que l'appel soi-disant Asynch arrive.
La solution
Cela semble me raisonnablement attendre.
Si vous mettez un appel Thread.Sleep
entre « créé » et « À partir » Je pense que vous verrez le « calcul » apparaît en ligne, montrant qu'il fait un travail alors que le thread principal est en cours d'exécution. C'est la façon dont il est asynchrone.
Si vous êtes inquiet parce que First()
renvoie la valeur elle-même, plutôt que de donner une sorte de « futur » valeur que vous pouvez consulter plus tard, qui est une autre affaire - et j'ai deux messages de blog pour vous de lire: 1 partie ; partie 2 . I pense vous voulez la méthode Prune
, mais je ne suis pas tout à fait sûr.
Autres conseils
La ligne // subscribe and wait for completion of background operation
dit qu'il attend que l'opération d'arrière-plan pour terminer. Donc, vous ne penseriez pas le code suivant cette ligne (Console.WriteLine("[Started]");
) pour exécuter jusqu'à ce que l'opération est terminée, non?
Tout d'abord bloque ... Abonnez-vous est ce que vous voulez:
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();
}