Activité delay pour Workflow hosté dans ASP.NET 2.0
Activité delay pour Workflow hosté dans ASP.NET 2.0
Lorsque vous manipulez des instances de Workflow dans ASP.NET 2.0, il est nécessaire d’utiliser le ManualWorkflowSchedulerServoce afin de dialoguer avec celles-ci tout en les faisant s’exécuter par le même thread que celui de la page / du webservice (et de minimiser l’utilisation de Threads).
Par exemple le code suivant permet de démarrer une instance du Workflow de type « Test » définit dans la DLL « WorkflowLibrary » en utilisant une instance de runtime stocké en variable d’application:
//récupére l'instance du runtime
WorkflowRuntime workflowRuntime = Application["WorkflowRuntime"] as WorkflowRuntime;
ManualWorkflowSchedulerService manualScheduler = workflowRuntime.GetService(typeof(ManualWorkflowSchedulerService)) as ManualWorkflowSchedulerService;
//creer et démarre une nouvelle instance du Workflow1
WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(WorkflowLibrary.Test));
instance.Start();
manualScheduler.RunWorkflow(instance.InstanceId);
L’instance ne démarre ici son exécution que quand le Scheduler lui en donne l’instruction alors que dans un contexte de Scheduler classique elle aurait été créé lors du .Start().
Pour activer le ManualWorkflowSchedulerServier il suffit :
• soit de le référencer dans le web.config de l’application :
<add type="System.Workflow.Runtime.Hosting.ManualWorkflowSchedulerService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
• Soit de le définir dans le code et l’ajouter comme service au runtime :
ManualWorkflowSchedulerService svr = new ManualWorkflowSchedulerService();
workflowRuntime.AddService(svr);
Le problème avec ce service est qu’il ne prend pas en compte les activités de type delay, si vous utilisez celles-ci, elles bloqueront chacune de vos instance de Workflow les atteignant car aucun événement de type « tick » n’est déclenché et n’atteint les instances.
Pour rendre celles-ci opérationnelles il suffit juste de modifier le paramétrage de votre ManuelWorkflowSchedulerService en activant la gestion de timers actif, et ici aussi, de deux manières possibles :
<add type="System.Workflow.Runtime.Hosting.ManualWorkflowSchedulerService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
UseActiveTimers="true" />
ou bien
ManualWorkflowSchedulerService svr = new ManualWorkflowSchedulerService(true);
workflowRuntime.AddService(svr)