C# Windows工作流进度输出

C# Windows工作流进度输出,c#,workflow-foundation-4,workflow-foundation,C#,Workflow Foundation 4,Workflow Foundation,我正在使用Windows Workflow 4/4.5来完成一些不同的业务任务。这些任务需要相当长的时间才能完成。我希望能够向用户显示工作流进度的视图 我的想法是制作类似于TFS构建输出的东西。它使用缩进来显示正在执行的子任务、记录的输出等 根据我的研究,我认为我应该使用一个自定义跟踪配置文件。我已经编写了一个,并指示它处理两种类型的查询,ActivityStateQuery和WorkflowInstanceQuery。前者为我提供了有关活动何时开始和完成以及其他状态的信息。后者为我提供了工作流

我正在使用Windows Workflow 4/4.5来完成一些不同的业务任务。这些任务需要相当长的时间才能完成。我希望能够向用户显示工作流进度的视图

我的想法是制作类似于TFS构建输出的东西。它使用缩进来显示正在执行的子任务、记录的输出等

根据我的研究,我认为我应该使用一个自定义跟踪配置文件。我已经编写了一个,并指示它处理两种类型的查询,ActivityStateQuery和WorkflowInstanceQuery。前者为我提供了有关活动何时开始和完成以及其他状态的信息。后者为我提供了工作流状态的指示

这让我得到了我想要的信息类型

我想将这些数据放入XML文档中,然后使用XSL将其转换为HTML。我遇到的问题是,我没有任何带有ActivityStateRecord的分层数据。我有一个活动,但我不知道它的父对象是什么时候执行Track方法的。如果没有这个上下文,我不确定如何将活动的状态添加到XML文档中

调用Track方法时分配的活动id使用“.”模式。我想我可以用它来确定层次结构,即1.5.8是一个活动,其父项id为1.5,其父项id为1。它似乎只与当前正在执行的活动相关,因为当我将活动放在其他活动(如序列)中时,ID的变化不会超过单个“.”。执行此操作时,我得到以下XML结构:

<logs>
  <log workflowInstanceId="bde36e74-0b39-4445-aac7-27f3e8cf5b1d">
    <activity activityId="1" activityName="TestActivity1" activityTypeName="SumTotal.WorkflowInstaller.Tests.Resources.TestActivity1">
      <status eventTime="2013-06-14T15:14:40.7847857Z" level="INFO">Executing: TestActivity1</status>
      <activity activityId="1.1" activityName="Sequence" activityTypeName="System.Activities.Statements.Sequence">
        <status eventTime="2013-06-14T15:14:53.3645053Z" level="INFO">Executing: Sequence</status>
        <status eventTime="2013-06-14T15:15:23.5382311Z" level="INFO">Closed: Sequence</status>
      </activity>
      <activity activityId="1.11" activityName="Assign" activityTypeName="System.Activities.Statements.Assign">
        <status eventTime="2013-06-14T15:14:54.9715972Z" level="INFO">Executing: Assign</status>
        <status eventTime="2013-06-14T15:14:54.9715972Z" level="INFO">Closed: Assign</status>
      </activity>
      <activity activityId="1.7" activityName="Sequence" activityTypeName="System.Activities.Statements.Sequence">
        <status eventTime="2013-06-14T15:14:58.2097824Z" level="INFO">Executing: Sequence</status>
        <status eventTime="2013-06-14T15:15:14.410709Z" level="INFO">Closed: Sequence</status>
      </activity>
      <status eventTime="2013-06-14T11:15:14.409709-04:00" level="DEBUG">Log: Test1 value</status>
      <activity activityId="1.2" activityName="Assign" activityTypeName="System.Activities.Statements.Assign">
        <status eventTime="2013-06-14T15:15:18.7189555Z" level="INFO">Executing: Assign</status>
        <status eventTime="2013-06-14T15:15:18.7189555Z" level="INFO">Closed: Assign</status>
      </activity>
      <status eventTime="2013-06-14T15:15:26.6104068Z" level="INFO">Closed: TestActivity1</status>
    </activity>
  </log>
</logs>

执行:测试活动1
执行:顺序
闭合:序列
执行:分配
关闭:分配
执行:顺序
闭合:序列
日志:Test1值
执行:分配
关闭:分配
已关闭:测试活动1
理想情况下,我希望生成以下XML:

<logs>
    <log workflowInstanceId="bde36e74-0b39-4445-aac7-27f3e8cf5b1d">
        <activity activityId="1" activityName="TestActivity1" activityTypeName="SumTotal.WorkflowInstaller.Tests.Resources.TestActivity1">
            <status eventTime="2013-06-14T15:14:40.7847857Z" level="INFO">Executing: TestActivity1</status>
            <activity activityId="1.1" activityName="Sequence" activityTypeName="System.Activities.Statements.Sequence">
                <status eventTime="2013-06-14T15:14:53.3645053Z" level="INFO">Executing: Sequence</status>
                <activity activityId="1.11" activityName="Assign" activityTypeName="System.Activities.Statements.Assign">
                    <status eventTime="2013-06-14T15:14:54.9715972Z" level="INFO">Executing: Assign</status>
                    <status eventTime="2013-06-14T15:14:54.9715972Z" level="INFO">Closed: Assign</status>
                </activity>
                <activity activityId="1.7" activityName="Sequence" activityTypeName="System.Activities.Statements.Sequence">
                    <status eventTime="2013-06-14T15:14:58.2097824Z" level="INFO">Executing: Sequence</status>
                    <status eventTime="2013-06-14T11:15:14.409709-04:00" level="DEBUG">Log: Test1 value</status>
                    <status eventTime="2013-06-14T15:15:14.410709Z" level="INFO">Closed: Sequence</status>
                </activity>
                <activity activityId="1.2" activityName="Assign" activityTypeName="System.Activities.Statements.Assign">
                    <status eventTime="2013-06-14T15:15:18.7189555Z" level="INFO">Executing: Assign</status>
                    <status eventTime="2013-06-14T15:15:18.7189555Z" level="INFO">Closed: Assign</status>
                </activity>
                <status eventTime="2013-06-14T15:15:23.5382311Z" level="INFO">Closed: Sequence</status>
            </activity>
            <status eventTime="2013-06-14T15:15:26.6104068Z" level="INFO">Closed: TestActivity1</status>
        </activity>
    </log>
</logs>

执行:测试活动1
执行:顺序
执行:分配
关闭:分配
执行:顺序
日志:Test1值
闭合:序列
执行:分配
关闭:分配
闭合:序列
已关闭:测试活动1

有没有什么方法可以获得这种类型的信息,或者有没有更好的方法来进行这种类型的跟踪/记录?

经过一些修改和重新思考,我能够实现我想要的输出类型

实际上,我一直在使用ActivityStateQuery状态期间使用的日志记录

我添加的是对跟踪配置文件的附加查询。我添加了一个ActivityScheduledQuery。ActivityScheduledRecord提供了调度活动和子活动的活动。这允许我在父节点下创建子节点的日志节点。子节点的ActivityInfo对象上的id与活动发生“正在执行”状态时的id匹配,然后我可以在ActivityStateQuery期间链接日志消息和状态消息

这是我的跟踪参与者对象的跟踪配置文件:

TrackingProfile = new TrackingProfile
        {
          Queries = 
            {
                new ActivityStateQuery
                {
                    ActivityName = "*",
                    States = { "*" }
                },
                new WorkflowInstanceQuery
                {
                  States = { WorkflowInstanceStates.Started, WorkflowInstanceStates.Completed }
                },
                new ActivityScheduledQuery
                {
                  ActivityName = "*",
                  ChildActivityName = "*"
                }
            }
        }