我有一组自定义活动,用于复杂的工作流程。
我希望在没有工作流处于空闲状态的情况下使它们(自定义活动)保持不变。它应该是一种故障转移系统,因此在执行工作流时出现问题时,它可以是:
我已经工作了几天工作流程持久性,但我不确定我是否可以实现我的目标。为什么呢?
您能告诉我,它的工作流程书签是什么方式?
我看到一些禁止书签的亮点,但我不能坚持下去并稍后恢复。你能不能给我一些提示,告诉我如何为以后的简历保留一个非阻塞书签?
修改
在wf3中有一个属性PersistOnClose
,这足以满足我的要求。
在wf4中,它被Persist
活动取代,这也很有用,但我不希望在我已经很复杂的工作流程中有额外的活动。
理想情况下,能够从context.RequestPersist(callback)
执行NativeActivityContext
会很棒,但是此方法是内部的(并且其中的所有内容在原始程序集之外都不可见。
答案 0 :(得分:3)
这是我的意思:
PersistOnCloseAttribute
不是一个选项,因为我使用的是WF4,此属性仅为.NET 3.x WF。解决方案是在每个自定义活动中使用Persist
活动(必须扩展NativeActivity
,这可以安排子活动):
//class field
Activity childActivity = new Persist();
为了使其工作,必须将其添加到元数据中作为ImplmentationChild:
protected override void CacheMetadata(NativeActivityMetadata metadata)
{
base.CacheMetadata(metadata);
metadata.AddImplementationChild(this.childActivity);
}
最后一件事是从Execute方法安排子活动(不管在哪里,只有在调用活动完成后才会发生持久性*)。
protected override void Execute(NativeActivityContext context)
{
//...
context.ScheduleActivity((Activity)this.childActivity);
}
为了保持工作流在未处理的异常后保持不变,必须将这段代码添加到WorkflowApplication中:
application.OnUnhandledException = delegate(WorkflowApplicationUnhandledExceptionEventArgs e)
{
return UnhandledExceptionAction.Abort;
};
*从Execute
方法返回并不一定意味着活动已经完成" - 即活动内部有阻止书签(见下面的缺点)。
此解决方案存在一些缺点:
答案 1 :(得分:0)
如果我理解你的问题,那么你有以下要求。
您可以使用以下步骤进行操作。
如果出现任何问题和定制需要讨论相同。:)因为我已经开发了类似于你的工作流程。