在我的工作流程应用程序中,我有一个使用书签暂停的NativeActivity:
context.CreateBookmark(bookmarkString, this.Continue);
现在我想建立一种机制,如果他在一段时间后没有继续工作流程,就会向用户发送通知电子邮件。因此我想使用
currentDelayActivity = new Delay();
context.ScheduleActivity(currentDelayActivity, OnDelayCompleted, OnDelayFaulted);
但是这里有一个问题:在调用书签后执行currentDelayActivity。书签是否存在工作流程是否存在问题?如果我使用
currentDelayActivity = new Sequence();
效果很好。 NativeActivity的完整代码:
public class TestActivity: NativeActivity<String>
{
private Variable<TimeSpan> delayTimeSpanVariable = new Variable<TimeSpan>();
private Activity currentDelayActivity;
protected protected override void Execute(NativeActivityContext context)
{
String bookmarkString = "Test";
context.CreateBookmark(bookmarkString, this.Continue);
TimeSpan timeSpan = new TimeSpan(0, 0, 5);
delayTimeSpanVariable.Set(context, timeSpan);
context.ScheduleActivity(currentDelayActivity, OnDelayCompleted, OnDelayFaulted);
}
private void OnDelayCompleted(NativeActivityContext context, ActivityInstance completed)
{
//This method is executed after the activity is continued (with the bookmark String)
}
private void OnDelayFaulted(NativeActivityFaultContext faultContext, Exception propagatedException, ActivityInstance propagatedFrom)
{
}
private void Continue(NativeActivityContext context, Bookmark bookmark, Object obj)
{
}
protected override void CacheMetadata(NativeActivityMetadata metadata)
{
base.CacheMetadata(metadata);
currentDelayActivity = new Delay();
((Delay)currentDelayActivity).Duration = new InArgument<TimeSpan>(delayTimeSpanVariable);
metadata.AddImplementationVariable(delayTimeSpanVariable);
metadata.AddImplementationChild(currentDelayActivity);
}
}
答案 0 :(得分:1)
你的活动似乎很奇怪......我不确定你真的了解你的问题。
AMHA您应该使用Pick活动,其中一个分支包含您的书签,另一个分支包含您的延迟。因此,工作流将继续任何分支首先完成。并且在延迟活动之后,您在延迟分支上设置“发送电子邮件”活动。如果您想定期发送提醒电子邮件,请将您的延迟+发送电子邮件放在while(true)
活动中,此分支将永远不会完成,它只会等待您的书签。
但无论如何,如果我正确理解了您的问题,当您使用书签我认为您应该覆盖CanInduceIdle
以返回true
:
protected override bool CanInduceIdle
{
get
{
return true;
}
}
答案 1 :(得分:0)
我改变了我的解决方案。例如,我添加了CanInduceIdle
,并将Delay
添加到Parallel
。这无助于解决我的问题。最后,使用所谓的NoPersistHandle
解决了我的问题。
protected override void Execute(NativeActivityContext context)
{
NoPersistHandle handle = noPersistHandle.Get(context);
handle.Enter(context);
context.CreateBookmark(bookmarkString, this.Continue, bookmarkOptions);
}
private void Continue(NativeActivityContext context, Bookmark bookmark, Object obj)
{
NoPersistHandle handle = noPersistHandle.Get(context);
handle.Exit(context);
}
此解决方案有效 - 但没有持久性。