Sécurité des threads de ManualWorkflowSchedulerService.RunWorkflow
-
08-07-2019 - |
Question
Je m'interrogeais sur l'utilisation appropriée de ManualWorkflowSchedulerService.RunWorkflow (). Dois-je synchroniser les appels au même workflowInstanceId sur plusieurs threads lorsque j'appelle ManualWorkflowSchedulerService.RunWorkflow?
La solution
Non, je ne le pense pas. Vous trouverez ci-dessous un extrait pertinent du book "
Bien que les opérations sur WorkflowInstance peut être appelé sur threads arbitraires, le planificateur WF hébergé dans l'instance de programme est desservi par un seul fil. Le WF le runtime garantit qu'aucun autre le fil peut interférer ou servir le programmateur alors que sa boucle de répartition est traiter activement les éléments de travail. Être clair, l'application d'hébergement peut invoquer les méthodes de WorkflowInstance le séparer les threads simultanément - ceci n'affecte pas le planificateur exécuter les activités sur un fil dédié (pour un épisode de exécution).
EDIT: pour approfondir le problème, j'ai créé un fichier wf avec un ParallelActivity
contenant deux activités HandleExternalEvent
. Le gestionnaire appelé
de chaque activité met simplement son thread en veille pendant 3 secondes. Dans le programme hôte, j'ai créé deux threads et déclenché les deux événements via le service. De plus, je sous-classe le ManualWorkflowSchedulerService
afin de suivre sa méthode Schedule
. Voici les résultats (le temps est en dixièmes de ms):
Src Time Thread
HOST 7616 1 CreateWorkflow
MWSS 7642 1 Schedule workflow
HOST 8297 12 Trigger event 1 and wait for RunWorkflow
MWSS 8316 12 Schedule workflow
WF 8327 12 Handler 1 Invoked...wait 3 sec
HOST 8327 1 Press any key to exit...
HOST 8767 13 Trigger event 2 and wait for RunWorkflow
MWSS 8784 13 Schedule workflow
WF 38319 12 Handler 1 Completed
WF 38406 12 Handler 2 Invoked...wait 3 sec
WF 68396 12 Handler 2 Completed
HOST 68573 13 RunWorkflow for event 2 completed in 5,98 sec
HOST 68794 12 WorkflowCompleted
HOST 68795 12 RunWorkflow for event 1 completed in 6,05 sec
Quelques remarques:
- Le planificateur utilise toujours le thread de l'hôte pour planifier le workitem.
- L'instance de flux de travail n'utilise pas toujours le thread de l'hôte pour exécuter les activités. Si une autre activité est déjà en cours d'exécution dans un fil, ce fil est utilisé pour exécuter toutes les activités planifiées.
- L'exécution des gestionnaires est sécurisée pour les threads, mais les deux threads attendent que les deux gestionnaires se terminent!
Si ce dernier problème vous concerne, je suggérerais les articles suivants:
- Description de ParallelActivity dans Flux de travail Windows
- Utiliser un workflow pour appeler des services Web en parallèle
BTW, pouvez-vous partager des informations sur le scénario auquel vous êtes confronté?