2010-08-24 88 views
0

我使用的是名为Body的一个子活动,一个名为OnFault ActivityAction一个NativeActivity的处理,这是我的代码:错误时抛出了NativeAcitivity

[Designer(typeof(RetryDesigner))] 
public sealed class Retry : NativeActivity { 

    public Activity Body { get; set; } 
    public ActivityAction<Exception> OnFault { get; set; } 

    protected override void CacheMetadata(NativeActivityMetadata metadata) { 
     metadata.AddChild(Body); 
     metadata.AddDelegate(OnFault); 
     base.CacheMetadata(metadata); 
    } 

    protected override void Execute(NativeActivityContext context) { 
     context.ScheduleActivity(Body, OnBodyCompleted, OnBodyFaulted); 
    } 

    void OnFaultCompleted(NativeActivityContext context, ActivityInstance instance) { 
     context.ScheduleActivity(Body); 
    } 

    void OnBodyCompleted(NativeActivityContext context, ActivityInstance instance) { 
    } 

    void OnBodyFaulted(NativeActivityFaultContext faultContext, Exception propagatedException, ActivityInstance propagatedFrom) { 
     faultContext.HandleFault(); 

     if (OnFault != null) { 
      faultContext.ScheduleAction<Exception>(OnFault, propagatedException, OnFaultCompleted); 
     } 
    } 
} 

和我的主要如下所示:

static void Main(string[] args) { 

     Variable<Exception> ex = new Variable<Exception>(); 
     DelegateInArgument<Exception> exception = new DelegateInArgument<Exception>(); 

     Retry retry = new Retry { 
      Body = new Sequence { 
       Variables = { ex }, 
       Activities = { 
        new Assign<Exception> { 
         To = new OutArgument<Exception>(ex), 
         Value = new InArgument<Exception>((env) => new Exception("test")) 
        }, 
        new Throw { 
         Exception = ex 
        } 
       } 
      }, 
      OnFault = new ActivityAction<Exception> { 
       Argument = exception, 
       Handler = new Sequence { 
        Activities = { 
         new WriteLine{ 
          Text = new InArgument<string>(env => 
          exception.Get(env).Message) 
         } 
        } 
       } 
      } 
     }; 

     var workflow = new WorkflowInvoker(retry); 
     workflow.Invoke(); 

     Console.WriteLine(); 
    } 

问题是异常不会停在OnBodyFaulted回调函数中,而是作为未经过验证的期望出现在主函数上。

如何停止OnBodyFault回调中的异常,工作流上是否有任何状态或属性?

回答

1

问题是,在OnFaultCompleted()中,您再次调用了context.ScheduleActivity(Body)。这次没有错误处理程序,这会导致再次发生相同的错误,并导致整个工作流程出错。