2009-06-26 8 views
7

A l'intérieur d'un flux de travail que je souhaite traiter et par erreur, par exemple, ne pas être en mesure de rechercher un nom d'utilisateur auquel je souhaite affecter une tâche. Donc, le nom d'utilisateur n'exsiste pas, je vais en aviser un administrateur par courriel, le consigner dans l'historique du flux de travail, puis mettre fin au flux de travail. La question est comment puis-je terminer le flux de travail depuis l'intérieur du flux de travail comme si je cliquais sur le bouton «Terminer le flux de travail» sur la page Web SharePoint. J'ai essayé SPWorkflowManager.CancelWorkflow() qui annule effectivement le workflow mais pas immédiatement. Qu'est-ce qui se passe est le code pour annuler les exécutions, mais mon flux de travail continue sur pour créer la tâche suivante, puis se met en veille lorsqu'il atteint l'activité suivante sur l'activité TaskChanged. Ce n'est qu'une fois qu'il s'est endormi que le workflow se termine, pas lorsque CancelWorkflow est appelé.Annulation par programme d'un flux de travail SharePoint

Cela provoque le problème évident que je ne veux pas que la tâche suivante soit créée. J'appelle CancelWorkflow parce que je veux qu'il annule alors et là.

+0

Avez-vous déjà trouvé la réponse à cette question? –

+0

Afriad pas. Vous pouvez le marquer pour annuler le flux de travail au milieu, mais ne l'arrêtez pas encore et encore. –

Répondre

9

Il y a tout à fait quelques suggestions à ce sujet MSDN:

Terminating a SharePoint Workflow Programatically

est ici un blog post qui contient succintement exactement les mêmes informations: Cancelling a SharePoint Workflow

Enfin, et plus particulièrement , vous devez utiliser la méthode statique: SPWorkflowManager.CancelWorkflow(SPWorkflow workflowInstanceToBeCancelled)

EDIT

CancelWorkflow est une classe statique, j'ai donc modifié l'appel.

+0

J'ai essayé mais ça n'a pas résolu mon problème. J'ai mis à jour le post principal pour refléter cela. –

+0

Si quelqu'un d'autre essaie SPWorkflowManager.CancelWorkflow(), vous risquez de le manquer la première fois. La méthode est statique, donc vous voulez l'appeler sur la classe elle-même et non sur l'objet gestionnaire de flux de travail qui peut être obtenu à partir du SPSite comme j'ai essayé. –

+2

Mais cela fonctionne correctement quand vous l'appelez correctement, non? Autrement dit, lorsque vous l'appelez sur la classe elle-même SPWorkflowManager.CancelWorkflow (SPWorkflow workflowInstance); alors il fait ce qu'il est censé faire. – DevinB

0

Je ne suis pas sûr que ce soit la meilleure façon, mais j'attrape simplement l'erreur, je l'enregistre, puis je la relance. Cela entraîne un état "Erreur survenue" dans la liste et arrête immédiatement le flux de travail.

protected override ActivityExecutionStatus Execute(ActivityExecutionContext provider) 
{ 
    try 
    { 
     // do work 
     // ... 
    } 
    catch (Exception e) 
    { 
     // log the error to the history list 
     // ... 
     throw; 
    } 

    return ActivityExecutionStatus.Closed; 
} 
0

C'est assez vieille question, mais d'annuler flux de travail de lui-même est tout de suite facile en utilisant ce morceau de code:

SPWorkflowManager.CancelWorkflow(workflowProperties.Workflow); 
throw new Exception(); 

workflowProperties dans cet exemple est

public SPWorkflowActivationProperties workflowProperties = 
      new SPWorkflowActivationProperties(); 

méthode CancelWorkflow marquera le workflow comme "canceling", mais ne l'arrêtera pas avant la pause (comme l'attente d'un événement ontaskchanged) ou d'une exception dans le workflow. Donc, la prochaine instruction de lancer une nouvelle exception() arrêtera le flux de travail et définira son statut "Annulé".

Questions connexes