为版本化工作流回收WorkflowServiceHost类。 WF 4

时间:2011-02-21 10:32:08

标签: .net workflow-foundation workflow-foundation-4

我的方案如下: 工作流XAML存储在数据库中,然后我从中创建WorkflowServiceHost,客户端可以调用它。没问题,直到这里:我在端点1处有XAML1。

稍后用户更改了xaml。据我所知,其他问题的解决方案是保留XAML1,并存储新的XAML2,并启动一个新的WorkflowServiceHost。 因此最终得到了针对XAML1 / XAML2的endpoint1 / endpoint2,客户端可以决定以哪种方式调用。

最后我的问题是,有没有办法检测到第一个WorkflowServiceHost内部没有待处理实例?我的意思是所有工作流程都在内部完成,您可以安全地处置该服务主机。

在最坏的情况下,如果实例正在运行,我可能会使用自定义跟踪参与者来记录,但也许还有其他方式....

// activity comes from xaml
var jobHost = new WorkflowServiceHost(activity, new Uri("net.pipe://localhost/WorkflowHost"));
jobHost.AddServiceEndpoint("IWorkflowHost", new System.ServiceModel.NetNamedPipeBinding(), "Job1");
// extensions
// behaviors
jobHost.Description.Behaviors.Add(_instanceStore);
jobHost.Open();

2 个答案:

答案 0 :(得分:2)

[System.Activities.DurableInstancing] .ServiceDeployments视图将为您创建的每个endpoind包含一条记录。其主键ServiceDeploymentId是[System.Activities.DurableInstancing] .Instances视图中的外键,其中包含每个工作流实例的记录。从那里它应该是一个简单的SQL查询来查找没有相关工作流实例的端点。

答案 1 :(得分:0)

如果您只是调用一次Workflow然后处理它,您可以收听WorkflowServiceHost的Closed事件。

svchost.Closed += SomeMethod;

private void SomeMethod(object sender, EventArgs e)
{
    // do something after WorkflowServiceHost has closed...
}