2010-07-06 3 views
0

Mon activité personnalisée a un délai qui devra être défini à différentes valeurs à différents moments. La première fois qu'il est défini, cela peut prendre 5 secondes. La deuxième fois, cela peut prendre 10 secondes, et ainsi de suite. Comment peut-on faire cela ... Delay n'a pas de lambda ActivityContext qui me permettra d'obtenir une variable de workflow.Modification de la durée de DelayActivity avec une durée différente

Répondre

0

La durée est une expression TimeSpan. Il suffit d'entrer une formule qui donne la bonne quantité de temps. Quelque chose comme TimeSpan.FromSeconds (5 * loopCounter)

1

Si votre activité provient de NativeActivity, ajoutez une variable privée en tant que variable d'implémentation pendant CacheMetadata et définissez cette valeur au fur et à mesure que vous progressez dans vos boucles d'activité. Quelque chose comme:

public class RetryTest : NativeActivity 
{ 
    private Variable<int> count = new Variable<int>("Count", 1); 
    private Variable<TimeSpan> delayInterval = new Variable<TimeSpan>("DelayInterval", TimeSpan.FromSeconds(5)); 
    private Delay delay = new Delay(); 

    protected override void CacheMetadata(NativeActivityMetadata metadata) 
    { 
     metadata.AddImplementationVariable(count); 
     metadata.AddImplementationVariable(delayInterval); 

     delay.Duration = new InArgument<TimeSpan>(delayInterval); 

     metadata.AddImplementationChild(delay); 
    } 

    protected override void Execute(NativeActivityContext context) 
    { 
     Console.WriteLine("{0} - Execute", DateTime.Now.ToLongTimeString()); 
     count.Set(context, count.Get(context) + 1); 
     context.ScheduleActivity(delay, OnDelayComplete); 
    } 

    private void OnDelayComplete(NativeActivityContext context, ActivityInstance completedInstance) 
    { 
     Console.WriteLine("{0} - DelayComplete", DateTime.Now.ToLongTimeString()); 
     if (count.Get(context) < 3) 
     { 

      delayInterval.Set(context, TimeSpan.FromSeconds(delayInterval.Get(context).Seconds * count.Get(context))); 
      context.ScheduleActivity(delay, OnDelayComplete); 
     } 
     count.Set(context, count.Get(context) + 1); 
    } 
} 

Cela devrait sortie

8:49:26 a.m. - Execute 
8:49:31 a.m. - DelayComplete 
8:49:41 a.m. - DelayComplete 
0

Eh bien, utilisez "TimeSpan.FromSeconds (5 *) loopCounter" comme dit Maurice, puis ajoutez une activité ASIGN de ​​boîte à outils, et définir loopCounter = loopCounter + 5 ...