以编程方式取消SharePoint工作流程

7
在工作流程中,我希望处理错误,例如无法查找要分配任务的用户名。因此,如果该用户名不存在,我将通过电子邮件通知管理员,将其记录到工作流程历史记录中,然后终止工作流程。
问题是,我如何从工作流程内部终止工作流程,就像在SharePoint网页上单击“终止工作流程”按钮一样。
[更新] 我尝试了SPWorkflowManager.CancelWorkflow(),它确实取消了工作流程,但不是立即取消。代码运行以取消,但然后我的工作流程序继续创建下一个任务,并在达到下一个任务的onTaskChanged活动时休眠。只有当它进入睡眠状态时,工作流程才会终止,而不是在调用CancelWorkflow时。
这会导致明显的问题,即我不希望创建下一个任务。我调用CancelWorkflow是因为我想立即取消它。

你有没有找到这个问题的答案? - Kit Menke
很抱歉,您不能立即停止它。但是您可以标记它以取消中间工作流程。 - Daniel Revell
3个回答

9

我已经尝试过这个方法,但它并没有解决我的问题。我已经更新了主贴以反映这一点。 - Daniel Revell
如果有其他人尝试使用SPWorkflowManager.CancelWorkflow(),您可能第一次会错过它。该方法是静态的,因此您需要对类本身进行调用,而不是从SPSite获取的工作流管理器对象,就像我尝试的那样。 - Daniel Revell
2
但是当你正确调用它时,它能正常工作,对吧?也就是说,当你在类本身上调用SPWorkflowManager.CancelWorkflow(SPWorkflow workflowInstance);时,它会执行它应该执行的操作。 - DevinB
是的,它可以正常工作,但是当您调用它时,它不会取消工作流程,而是必须标记工作流程以在停止执行后被取消。也就是说,当它进入等待事件的睡眠状态时,我希望它能够立即取消。 - Daniel Revell
你不能从catch块中将工作流程挂起吗? - DevinB
我已经寻找这个问题一段时间了,StackOverflow帮了我一个大忙。感谢@DevinB。 - Chris Ballance

0

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

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

    return ActivityExecutionStatus.Closed;
}

0

这是一个相当老的问题,但是要立即从工作流程中取消自身很容易,只需使用这段代码:

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

在这个例子中,workflowProperties 是

public SPWorkflowActivationProperties workflowProperties = 
           new SPWorkflowActivationProperties();

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接