1

当 wf等待响应(书签或空闲)且未完成时,使用 WorkflowApplication 访问出参数

4

3 回答 3

1

我还使用 Tracking 来检索值,但我没有将其保存到数据库中,而是提出了以下解决方案。
创建一个跟踪参与者并从活动中收集数据。您可以使用特定的跟踪查询微调跟踪参与者配置文件。我添加了一个公共属性 Output 来设置记录中数据的值。

public class CustomTrackingParticipant : TrackingParticipant
{
        //TODO: Fine tune the profile with the correct query.
        public IDictionary<String, object> Outputs { get; set; }
        protected override void Track(TrackingRecord record, TimeSpan timeout)
        {
            if (record != null)
            {
                if (record is CustomTrackingRecord)
                {
                    var customTrackingRecord = record as CustomTrackingRecord;
                    Outputs = customTrackingRecord.Data;
                }
            }
        }
    }

在您的自定义活动中,您可以使用 CustomTrackingRecord 设置要公开用于跟踪的值。这是一个示例,可以为您提供一个想法。

protected override void Execute(NativeActivityContext context)
{
    var customRecord = new CustomTrackingRecord("QuestionActivityRecord");
    customRecord.Data.Add("Question", Question.Get(context));
    customRecord.Data.Add("Answers", Answers.Get(context).ToList());
    context.Track(customRecord);
    //This will create a bookmark with the display name and the workflow will go idle.
    context.CreateBookmark(DisplayName, Callback, BookmarkOptions.None);
}

在 WorklfowApplication 实例上,您可以将 Tracking 参与者添加到扩展中。

workflowApplication.Extensions.Add(new CustomTrackingParticipant());

在来自 workflowApplication 实例的可持久空闲事件上,我使用以下方法订阅。在该方法中,我从扩展中获取了跟踪参与者。因为我们已经在公共属性中设置了输出,所以我们可以访问它们并将它们设置在工作流之外的成员中。请参阅以下示例。

private PersistableIdleAction PersistableIdle(WorkflowApplicationIdleEventArgs 
workflowApplicationIdleEventArgs)
{
    var ex = workflowApplicationIdleEventArgs.GetInstanceExtensions<CustomTrackingParticipant>();
    Outputs = ex.First().Outputs;
    return PersistableIdleAction.Unload;
}

我希望这个例子有所帮助。

于 2013-08-22T20:26:40.733 回答
0

更简单:在开始等待响应之前,使用另一个工作流活动来存储您在某处(数据库、文件等)寻找的值!

于 2013-05-16T12:18:41.203 回答
0

您可以使用Tracking

所需的步骤是:

  • 定义一个跟踪配置文件,该配置文件查询状态为关闭的 ActivityStates
  • 实现一个 TrackingParticipant 以将 OutArgument 保存在进程内存、数据库或磁盘上的文件中
  • 把所有东西联系在一起

该链接包含执行此操作所需的所有信息。

于 2013-05-16T12:12:57.443 回答