2011-04-14 8 views
1

Est-il possible d'utiliser Async CTP pour émuler les suites et la récursion de la queue?Continuations utilisant Async CTP

Je pense quelque chose le long des lignes de:

async Task Loop(int count) 
{ 
    if (count == 0) 
     retrun; 

    await ClearCallStack(); 
    //is it possible to continue here with a clean call stack? 
    Loop(count -1) 
} 

Je suppose que l'on a besoin d'un planificateur personnalisé et tel, mais serait-il possible? (c'est-à-dire, peut-il être utilisé pour récurer sans envoyer la pile d'appels)

Répondre

4

Oui, c'est tout à fait possible.

Dans le tout nouveau CTP Async (Actualiser pour VS2010 SP1), il existe une classe "GeneralThreadAffineContext" dans l'exemple Unit Testing (en VB ou C#). Cela fournit le code d'assistance requis pour l'exécution juste d'une méthode async dans une manière affine thread-usage général. Par affinité de thread, nous entendons que les suites asynchrones sont traitées dans le même contexte que le thread d'origine, de manière similaire au comportement de WinForms/WPF, mais sans faire tourner la vraie boucle de message WPF ou WinForms. Le but de cette méthode est de reporter le reste de la méthode en cours sur le SynchronizationContext, de sorte que vous n'avez même pas besoin d'écrire votre propre await ClearCallStack(). Au lieu de cela, votre échantillon se résumera à:

async Task DoLoop(int count) 
{ 
    // yield first if you want to ensure your entire body is in a continuation 
    // Final method will be off of Task, but you need to use TaskEx for the CTP 
    await TaskEx.Yield(); 

    if (count == 0) 
     return; 

    //is it possible to continue here with a clean call stack? 
    DoLoop(count -1) 
} 

void Loop(int count) 
{ 
    // This is a stub helper to make DoLoop appear synchronous. Even though 
    // DoLoop is expressed recursively, no two frames of DoLoop will execute 
    // their bodies simultaneously 
    GeneralThreadAffineContext.Run(async() => { return DoLoop(count); }); 
} 
+0

Où se trouvent ces extensions? La régénération asynchrone du SP1 est installée. Impossible de trouver le rendement ni le contexte général. –

+0

GeneralThreadAffineContext ne fait pas partie de l'API officielle - il s'agit en fait d'un code d'assistance dans l'exemple de test unitaire. De plus, pour les objectifs du CTP, Yield() est une méthode hors de TaskEx car notre but était de pouvoir déployer les API du framework CTP sans avoir à patcher le framework .NET. –

Questions connexes