2010-09-28 5 views
0

Comment puis-je vérifier depuis mon NativeActivity si la méthode 'Annuler' de l'application de workflow a été invoquée?WF: Vérifie si l'application de workflow a été annulée à partir d'une activité personnalisée

J'ai essayé d'utiliser la propriété 'IsCancellationRequested' du contexte mais cela ne fait pas grand-chose.

Voici mon exemple:

public class Program 
{ 
    static void Main(string[] args) 
    { 
     ManualResetEventSlim mre = new ManualResetEventSlim(false); 
     WorkflowApplication app = new WorkflowApplication(new Sequence() { Activities = {new tempActivity(), new tempActivity() } }); 
     app.Completed += delegate(WorkflowApplicationCompletedEventArgs e) 
     { 
      mre.Set(); 
     }; 
     app.Run(TimeSpan.MaxValue); 
     Thread.Sleep(2000); 
     app.BeginCancel(null,null); 
     mre.Wait(); 
    } 
} 

public class tempActivity : NativeActivity 
{ 
    protected override void Execute(NativeActivityContext context) 
    { 
     Console.WriteLine("Exec tempActivity"); 
     for (int i = 0; i < 10; i++) 
     { 
      Thread.Sleep(1000); 
      Console.Write("."); 
      if (context.IsCancellationRequested) 
       return; 
     } 
    } 
} 

Merci!

Répondre

2

Presque tout dans le flux de travail est planifié et exécuté de manière asynchrone. Cela inclut l'annulation afin que le blocage dans les exécutions s'assure que la demande d'annulation n'est jamais traitée.

Vous devez écrire quelque chose d'activité comme celui-ci:

public class tempActivity : NativeActivity 
{ 
    private Activity Delay { get; set; } 
    private Variable<int> Counter { get; set; } 

    protected override void CacheMetadata(NativeActivityMetadata metadata) 
    { 
     Counter = new Variable<int>(); 
     Delay = new Delay() { Duration = TimeSpan.FromSeconds(1) }; 

     metadata.AddImplementationChild(Delay); 
     metadata.AddImplementationVariable(Counter); 

     base.CacheMetadata(metadata); 
    } 


    protected override void Execute(NativeActivityContext context) 
    { 
     OnCompleted(context, null); 
    } 

    private void OnCompleted(NativeActivityContext context, ActivityInstance completedInstance) 
    { 
     var counter = Counter.Get(context); 
     if (counter < 10 && !context.IsCancellationRequested) 
     { 
      Console.Write("."); 
      Counter.Set(context, counter + 1); 
      context.ScheduleActivity(Delay, OnCompleted); 
     } 
    } 
} 
+0

I don 't attendre à ce que l'opération d'annulation interrompra le fil conducteur de la méthode d'exécution mais je veux obtenir une sorte de notification que la l'application de workflow a été annulée. pourquoi la propriété 'IsCancellationRequested' n'est pas définie sur true? –

+0

Il est défini sur true dès que vous modifiez le moteur d'exécution. Tant que vous ne revenez pas de l'Execute(), le runtime n'obtient pas de changement pour faire quoi que ce soit. – Maurice

+0

Je ne comprends toujours pas pourquoi (il ne pouvait pas fonctionner à partir d'un fil différent?). peut-être pourriez-vous expliquer un peu plus ou ajouter des liens supplémentaires. Merci! –

Questions connexes