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.

Était-ce utile?

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();
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top