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