2012-12-11 46 views
0

我有一个带In/Out参数的工作流,但我没有将它返回到WorkflowApplicationCompletedEventArgs.Outputs中。无法从WorkflowApplication中获取参数

我有2个参数:

DataParams which is In/Out 
    ClassParams which is In 

我打电话这样的工作流程:

IDictionary<string, object> inParams = new Dictionary<string, object> 
    { 
    {"DataParams", _dataParameters }, 
    {"ClassParams", _classParameters }, 
    }; 


    workflowApp = new WorkflowApplication(new actSendToClient(), inParams); 
    workflowApp.Completed = e => SendToClientWorkflowCompleted(e); 
    workflowApp.Run(); 

后,如果用户取消在主机调用此方法有些时间:

workflowApp.Cancel(); 

哪个路由到委托方法:

public void SendToClientWorkflowCompleted(WorkflowApplicationCompletedEventArgs e) 
{ 
    var output = e.Outputs; 
} 

我在e.Outputs中没有任何东西。我究竟做错了什么?

+0

谁知道?你是否在根Activity上定义了OutArgument?取消可能会在更新之前调用,所以这是有道理的。或者你是否期望你的'inParams'在'e.Outputs'中?那不会发生。如果您以后需要这些参考资料,您必须坚持参考。 – Will

+0

Doh!请继续参考。有时候我很愚蠢。 – Richard210363

回答

0

如果工作流程运行良好,您只能获得输出参数。当你取消工作流程时,你告诉它不这样做。如果您需要一种方法来在工作流程的一半中停止工作流程,并且仍然认为它是正常工作的结束,则需要以某种方式在您的工作流程中对此进行建模。要么通过显式添加逻辑来规避部分活动,要么通过抛出异常并向抛出的异常添加额外的数据。在后一种情况下,运行时可以检查异常并查看从那里获取的数据。

通常我更喜欢第一种方法,如果这真的是业务流程的一部分。

0

请注意,如果您希望输出参数在取消路径中有效,您可以将根活动包装在CancellationScope中,该取消范围设置CancellationHandler中的OutArguments。

另外需要注意的是,OutArgument的值反映了工作流中该参数的状态。也就是说,如果您在活动中途填充OutArgument,则这些值将反映在OutArgument中。这与分配给C#out的参数一致,然后该方法随后引发异常。