C# 检测所有工作流序列何时空闲

C# 检测所有工作流序列何时空闲,c#,.net,wcf,workflow-foundation-4,C#,.net,Wcf,Workflow Foundation 4,我的工作流主要由相同的元素组成。 每个元素的定义如下: 工作流可以简单地按顺序堆叠这些元素,它可以并行运行这些元素,它可以在它们之间进行分支,等等。工作流设计者完全可以自由使用这些元素。整个过程都是作为WCF服务托管的,但如果可能的话,我不希望依赖于它 整个设置的高层次理念如下: 当工作流启动时,这些元素一个接一个地启动,快速跳过顶部条件分支。上一个元素的完成导致下一个元素的开始-如工作流中所定义 在某些情况下,当条件[B]正确时,元素可能会占用底部分支并等待WCF调用 迟早,要么所有元素都会

我的工作流主要由相同的元素组成。
每个元素的定义如下:

工作流可以简单地按顺序堆叠这些元素,它可以并行运行这些元素,它可以在它们之间进行分支,等等。工作流设计者完全可以自由使用这些元素。整个过程都是作为WCF服务托管的,但如果可能的话,我不希望依赖于它

整个设置的高层次理念如下:

  • 当工作流启动时,这些元素一个接一个地启动,快速跳过顶部条件分支。上一个元素的完成导致下一个元素的开始-如工作流中所定义
  • 在某些情况下,当条件
    [B]
    正确时,元素可能会占用底部分支并等待WCF调用
  • 迟早,要么所有元素都会停止,要么工作流完全结束
  • 我需要的是抓住所有元素停止等待WCF呼叫的那一刻。

    此时,我需要执行一些计算,这些计算将影响工作流的进一步流动。因此,我需要准确地抓住那个时刻

    一些注意事项:

  • 我保证在我进行这些计算之前不会有WCF呼叫。因此,连接到WCF调用的可能竞争条件超出范围
  • 我没有控制其控制流的应用程序。换句话说,我托管在IIS中,因此可能会在没有通知的情况下重新启动,并且无法设置计时器、长时间运行的循环、消息泵等
  • 我不控制工作流的设计
  • 但是,我完全控制元素的设计。事实上,这个元素实际上是一个
    本地活动
    (这就是为什么这个图表来自Visio:-),我控制它的源代码
  • 在某种程度上,我还可以控制托管环境。也就是说,我可以修改工作流所在的web应用程序
  • 整个工作流“附加”到业务对象,所有元素都可以访问它

  • 最好的方法是创建一个TrackingParticipant扩展。此扩展将接收跟踪方法中的所有跟踪记录。然后,当它收到WorkflowInstanceStateRecord且状态为“Idle”时,您将知道工作流处于空闲状态。活动可以访问此扩展以从中接收数据,也可以对其调用方法


    这是我在

    中使用的技巧,谢谢您的指导。然而我没有看到名为
    WorkflowInstanceStateRecord
    的类。
    TrackingParticipant.Track
    方法的第一个参数是
    TrackingRecord
    ,它没有名为
    State
    或类似的属性。我也没有看到允许我访问工作流主机并通过id获取工作流实例的服务定位器。有什么帮助吗?啊,明白了!它是
    WorkflowInstanceRecord
    ,其中没有“状态”。现在找到了。等一下,我正在挖掘…好的,这样我就可以截取跟踪参与者的沉默时刻,幸运的是,这很有效。但现在我发现自己无法从参与者内部访问关联的业务对象。My activities从注册为工作流扩展的DI容器获取存储库。活动可以通过其
    NativeActivityContext
    访问DI容器。但是参与者呢?您的活动可以通过调用context.GetExtension()获取跟踪参与者,然后在跟踪参与者上设置业务对象。您应该创建一些接口并查找它,而不是TrackingParticipant类,因为可能有多个接口。因为my participant不是按工作流实例定义的,而是按主机定义的,所以只要有多个实例同时运行,这种方法就会中断。有没有办法定义每个实例的参与者?还有其他想法吗?