以编程方式取消SharePoint工作流

时间:2009-06-26 12:55:48

标签: c# sharepoint workflow

在工作流程中,我想处理和错误,例如无法查找我想要分配任务的用户名。因此用户名不存在,我将通过电子邮件通知管理员,将其记录到工作流程历史记录中,然后终止工作流程。

问题是,如何从工作流内部终止工作流,就像我点击SharePoint网页上的“终止工作流程”按钮一样。

[更新] 我尝试过SPWorkflowManager.CancelWorkflow()确实取消了工作流程,但没有立即取消。取消运行的代码会发生什么,但随后我的工作流程继续创建下一个任务,然后在下一个任务onTaskChanged活动时进入休眠状态。只有一旦它进入睡眠状态,工作流才会终止,而不是在调用CancelWorkflow时。

这导致了一个明显的问题,即我不希望创建下一个任务。我正在调用CancelWorkflow,因为我希望它取消然后在那里。

3 个答案:

答案 0 :(得分:9)

这篇MSDN主题提出了不少建议:

<强> Terminating a SharePoint Workflow Programatically

这是一篇博文,其中包含完全相同的信息: Cancelling a SharePoint Workflow

最后,最具体地说,您需要使用静态方法:SPWorkflowManager.CancelWorkflow(SPWorkflow workflowInstanceToBeCancelled)

编辑

CancelWorkflow是一个静态类,所以我修改了这个调用。

答案 1 :(得分:0)

我不确定这是否是最好的方法,但我只是抓住错误,记录它,然后重新抛出它。这会导致列表中出现“Error Error”状态,并立即停止工作流程。

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

    return ActivityExecutionStatus.Closed;
}

答案 2 :(得分:0)

这是一个非常古老的问题,但是使用这段代码可以很容易地立即取消工作流程:

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

此示例中的workflowProperties是

public SPWorkflowActivationProperties workflowProperties = 
           new SPWorkflowActivationProperties();

CancelWorkflow方法会将工作流标记为&#34;取消&#34;,但在暂停(例如等待ontaskchanged事件)或工作流中的异常之前不会停止它。所以抛出新的Exception()的下一个声明将停止工作流并设置它的状态&#34;取消&#34;。