2010-02-19 6 views
5

Je joue avec Rx dans .Net3.5SP1 et en essayant le 101 Rx Samples. J'essaie le premier exemple (Start - Run Code asynchrone) mais il ne semble pas réellement fonctionner de manière asynchrone. Par exemple,Rx dans .Net 3.5 non asynchrone?

 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 que ce comportement est attendu?

MISE À JOUR

je l'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.

Répondre

1

Cela me semble raisonnable. Si vous mettez un appel Thread.Sleep entre "Créé" et "Démarrage", je pense que la ligne "Calcul" apparaît, indiquant qu'il fonctionne pendant que le thread principal est en cours d'exécution. C'est comme ça que c'est asynchrone. Si vous êtes concerné parce que First() renvoie la valeur elle-même, plutôt que de donner une sorte de "future" valeur que vous pouvez consulter plus tard, c'est une question différente - et j'ai deux billets de blog pour vous lire: part 1; part 2. Je pense que vous voulez la méthode Prune, mais je ne suis pas entièrement sûr.

+0

Non, ce n'est pas la question ... la question est la séquence des événements. Je l'aurais pensé qu'il aurait dit [Création] [créé] [Démarrage] Calcul ... [Démarré] <... 3 Second WAIT ...> Terminé. Mais le thread principal est bloqué pendant l'appel supposé Asynch ... –

+0

@kouPhax: La méthode First() doit * renvoyer * la valeur, n'est-ce pas? (Certes, la valeur est simplement 'Unit' dans ce cas, mais tout de même ...) Cela signifie qu'elle ne peut pas se terminer tant que * le calcul n'est pas terminé. Fondamentalement, le calcul * est * allumé de manière asynchrone, mais l'appel First() attend qu'il se termine. Le commentaire dit explicitement que: "// s'abonner et attendre la fin de l'opération en arrière-plan" –

+0

Ha! Supposons que je devrais apprendre à lire! Merci –

1

La ligne // subscribe and wait for completion of background operation indique qu'il attend la fin de l'opération d'arrière-plan. Vous ne vous attendez donc pas à ce que le code suivant cette ligne (Console.WriteLine("[Started]");) s'exécute tant que l'opération n'est pas terminée, n'est-ce pas?

1

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