Il m'est souvent arrivé ces derniers temps de voir des services Workflow Foundation de type :

wf4_wcf_stopwhile

Ceci est gênant à plus d'un titre et m'oblige à poser quelques questions :

  • Avez-vous vraiment besoin d'avoir une instance de workflow qui ne prend jamais fin?
  • N'y aurait-il pas un risque de se retrouver avec une quantité infinie d'instances de workflows à un instant T?

Ces deux questions n'en font en fait qu'une, mais vous ne comprenez peut-être pas pourquoi je les pose. Si vous avez bien saisi l'utilité du workflowServiceHost et son fonctionnement, vous ne construirez jamais ce workflow. Mais si vous suivez les patterns workflows, vous le ferrez.

Alors pourquoi existait-il une différence entre les patterns et le monde réel? Les patterns sont là pour nous aider! normalement...

Oui je sais, mais un pattern comme celui-ci ne sert à rien dans WF4. Si on reprend ce que j'ai présenté dernièrement du WorkflowServiceHost, par défaut, un nouvelle instance de workflow est créée pour chaque appel du client hors mis en cas de corrélation.

Donc, si vous n'utilisez pas la corrélation vous ne réutiliserez jamais l'instance de workflow créé. il faut donc la laisser se terminer. Une boucle While ou DoWhile ne rend pas à nouveau disponible votre Receive, c'est le WorkflowServicehost qui fait ce job.

Une boucle While/DoWhile ne peut donc être vraiment utile que dans le cas de l'usage de la corrélation car pour qu'une instance ne peut être rappelé sans corrélation. Et encore, soyez prudent. Préférez peut-être un autre dispositif, car dans ce cas, votre activité Receive n'est disponible qu'à partir du moment que votre workflow n'effectue pas le traitement lui succédant. Ce pattern peut donc être fatal en cas d'appels répétés et de tâches lourdes.

Dans tous les cas, il est à proscrire... ou à utiliser prudemment, même si vous êtes du genre casse-cou ;)

PS : Peut être aurez vous autre chose à mettre dans la condition du While/DoWhile, ceci ne change pas grand chose au danger que ceci représente sans buffer des appels des activités Receive .