0

J'essaie de mieux comprendre .NET Workflow Foundation, en particulier comment fonctionne la fonction de persistance/déchargement et reprise.Pourquoi le Workflow ne se réveille-t-il pas après avoir été déchargé?

Donc, à des fins de test, j'ai créé une activité très simple et j'ai essayé de l'héberger dans un WorkflowApplication. Je voudrais apprendre à utiliser la possibilité de conserver les instances de workflow lorsqu'elles sont inactives. Donc, je l'ai écrit le code suivant:

var store = new SqlWorkflowInstanceStore("......"); 
var identity = new WorkflowIdentity("MyAwesomeWorkflow", Version.Parse("1.0"), String.Empty); 
var activity = new Sequence() 
{ 
    Activities = 
    { 
     new WriteLine() {Text = "hello"}, 
     new Delay() {Duration = TimeSpan.FromSeconds(5)}, 
     new WriteLine() {Text = "bye"}, 
    } 
}; 
var wfapp = new WorkflowApplication(activity, identity); 
var resetEvent = new ManualResetEventSlim(); 
wfapp.InstanceStore = store; 
wfapp.PersistableIdle = delegate(WorkflowApplicationIdleEventArgs e) 
{ 
    Console.WriteLine("Persistable idle"); 
    return PersistableIdleAction.Unload; 
}; 
wfapp.Completed += delegate(WorkflowApplicationCompletedEventArgs eventArgs) 
{ 
    Console.WriteLine("completed"); 
    resetEvent.Set(); 
}; 

wfapp.Run(); 
resetEvent.Wait(); 

Le flux de travail est déchargé lorsque l'activité Delay commence, mais il ne reprend pas lorsque le Delay est terminée. Je ne suis pas un expert de la Workflow Foundation, donc je me rends compte que je dois utiliser l'API de manière incorrecte. Selon mes collégues, le flux de travail devrait automatiquement se réveiller et reprendre l'exécution lorsque le Delay est terminé.

J'ai lu this MSDN article sur le sujet mais cela ne semble pas très bien expliquer cet aspect.

+0

WorkflowApplication (contrairement à l'hôte de service) ne reprendra pas les workflows déchargés pour vous - vous devez le faire manuellement. – Evk

+0

@Evk Pouvez-vous élaborer un peu plus? – Venemo

+1

Eh bien pas sûr que je peux dire plus. Lorsque vous utilisez WorkflowServiceHost - il peut reprendre les workflows déchargés pour vous. WorkflowApplication ne peut pas, donc votre exemple fonctionne comme prévu, il n'y a rien de mal à vos côtés. – Evk

Répondre

2

En attendant, je l'ai compris. Comme personne n'a posté de réponse, je l'afficherai juste au cas où quelqu'un chercherait une solution. Fondamentalement, le moteur de workflow ne prend pas en charge la reprise automatique des instances de flux de travail. Il est quelque peu trompeur, mais WorkflowApplication ne supporte pas cela.

Ainsi, vous pouvez:

  • sondage manuellement la base de données de stockage d'instance et de reprendre les instances de flux de travail lorsque cela est approprié
  • utilisation WorkflowServiceHost qui met en œuvre le même sondage sous le capot