繁体   English   中英

以编程方式取消SharePoint工作流

[英]Programmatically Cancel a SharePoint Workflow

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

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

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

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

这个MSDN线程有很多建议:

以编程方式终止SharePoint工作流

这是一篇博客文章,其中包含完全相同的信息: 取消SharePoint工作流程

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

编辑

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

我不确定这是否是最好的方法,但我只是抓住错误,记录它,然后重新抛出它。 这会导致列表中出现“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;
}

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

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

此示例中的workflowProperties是

public SPWorkflowActivationProperties workflowProperties = 
           new SPWorkflowActivationProperties();

CancelWorkflow方法将工作流标记为“取消”,但在暂停(例如等待ontaskchanged事件)或工作流中的异常之前不会停止它。 所以抛出new Exception()的下一个语句将停止工作流并将其状态设置为“Canceled”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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