2014-01-09 2 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) 전자 메일을 보내면이 분기는 완료되지 않고 책갈피 만 기다립니다. 내가 제대로 문제를 이해 한 경우 즐겨 찾기를 사용할 때

어쨌든은, 당신이 true을 반환 CanInduceIdle를 오버라이드 (override) 할 필요가 생각 :

protected override bool CanInduceIdle 
{ 
    get 
    { 
     return true; 
    } 
} 
0

내가 내 솔루션 상당히 변경되었습니다. 예를 들어 CanInduceIdle을 추가하고 DelayParallel에 추가했습니다. 이것은 내 문제를 해결하는 데 도움이되지 못했습니다. 마지막으로 소위 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); 
} 

이 솔루션은 작동하지만 지속성은 없습니다.