在NativeActivity中创建书签后不执行延迟

时间:2014-01-09 16:34:58

标签: c# workflow-foundation-4 workflow-foundation

在我的工作流程应用程序中,我有一个使用书签暂停的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);
        }
    }

2 个答案:

答案 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);
}

此解决方案有效 - 但没有持久性。