当 wf等待响应(书签或空闲)且未完成时,使用 WorkflowApplication 访问出参数
问问题
1283 次
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 回答