2014-01-09 48 views
1

在我的工作流應用程序我有一個暫停與書籤的NativeActivity的後不執行:延遲一個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); 
     } 
    } 

回答

1

您的活動似乎很奇怪......我不確定要真正理解您的問題。

AMHA你應該使用Pick活動,包含一個分支你的書籤,幷包含您的延遲另一個分支。所以工作流程將繼續先完成任何分支。在延遲活動之後,您在延遲分支上設置「發送電子郵件」活動。如果您想要定期發送提醒電子郵件,請延遲併發送電子郵件至while(true)活動,並且此分支永遠不會完成,它只會等待您的書籤。

但無論如何,如果我理解正確的問題,因爲你使用書籤,我認爲你應該重寫CanInduceIdle返回true

protected override bool CanInduceIdle 
{ 
    get 
    { 
     return true; 
    } 
} 
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); 
} 

此解決方案的工作原理 - 但沒有持久性。