简体   繁体   中英

Programmatically Cancel a SharePoint Workflow

Inside a workflow I want to handle and error such as not being able to lookup a username that I want to assign a task to. So the username doesn't exsist, I'm going to notify an administrator by email of this, log it to the workflow history and then terminate the workflow.

Question is, how do I terminate the workflow, from inside the workflow as if I was clicking the 'terminate workflow' button on the SharePoint webpage.

[Update] I've tried SPWorkflowManager.CancelWorkflow() which does indeed cancel the workflow but not immediately. What happens is the code to cancel runs but then my workflow continues on to create the next task and then goes to sleep when it hit's the next tasks onTaskChanged activity. Only once it has gone to sleep does the workflow get terminated, not when CancelWorkflow is called.

This causes the obvious problem that I don't want the next task to be created. I'm calling CancelWorkflow because I want it to cancel then and there.

There are quite a few suggestions at this MSDN Thread:

Terminating a SharePoint Workflow Programatically

Here's a blog-post that succintly contains the exact same information: Cancelling a SharePoint Workflow

Lastly, and most specifically, you need to use the static method: SPWorkflowManager.CancelWorkflow(SPWorkflow workflowInstanceToBeCancelled)

EDIT

CancelWorkflow is a static class, so I've amended the call.

I'm not sure if this is the best way, but I just catch the error, log it, and then re-throw it. This results in an "Error Occurred" state in the list and immediately stops the workflow.

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

    return ActivityExecutionStatus.Closed;
}

This is pretty old question, but to cancel workflow from itself right away is easy using this piece of code:

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

workflowProperties in this example is

public SPWorkflowActivationProperties workflowProperties = 
           new SPWorkflowActivationProperties();

CancelWorkflow method will flag workflow as "canceling", but will not stop it until pause (like waiting for ontaskchanged event) or exception in the workflow. So next statement of throw new Exception() will stop workflow and set it's status "Canceled".

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM