Workflow Windows工作流:";“单身人士”-样式工作流?

Workflow Windows工作流:";“单身人士”-样式工作流?,workflow,workflow-foundation,Workflow,Workflow Foundation,我有一个工作流,它可以监视某些数据库,并在发现触发器时启动其他工作流。我只希望这个“观察者”工作流的一个实例在任何时间点运行;否则,如果有两个或多个正在运行,它们都会注意到更改,并且都会启动相同的工作流,这不会很好地工作 此“观察者”工作流被持久化。那么…我如何使它,如果运行时没有一个这个工作流的实例已被持久化,它启动一个,但如果一个已经存在,只使用持久化的一个 听起来我几乎可以创建一个小的run once控制台应用程序,启动我想要的工作流,然后“真正的”运行时只是拉了一个持久化的应用程序,从未

我有一个工作流,它可以监视某些数据库,并在发现触发器时启动其他工作流。我只希望这个“观察者”工作流的一个实例在任何时间点运行;否则,如果有两个或多个正在运行,它们都会注意到更改,并且都会启动相同的工作流,这不会很好地工作

此“观察者”工作流被持久化。那么…我如何使它,如果运行时没有一个这个工作流的实例已被持久化,它启动一个,但如果一个已经存在,只使用持久化的一个


听起来我几乎可以创建一个小的run once控制台应用程序,启动我想要的工作流,然后“真正的”运行时只是拉了一个持久化的应用程序,从未尝试创建一个新的应用程序,但这听起来不是很优雅。

我们不久前在一个项目中遇到了这个问题。我们提出的解决方案是托管两个运行时;一个有持久性服务,一个没有。在没有持久性服务的运行时,我们运行了两个这种“监视工作流”,它们在主机启动时自动启动

这就是它的实施方式:

首先,我们有一个配置文件,其中设置了持久性服务:

<configuration>
    <configSections>
        <section name="RuntimeWithPersistence" type="System.Workflow.Runtime.Configuration.WorkflowRuntimeSection, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
    </configSections>
    <RuntimeWithPersistence>
        <CommonParameters/>
        <Services>
            <add type="System.Workflow.Runtime.Hosting.DefaultWorkflowSchedulerService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
            <add type="System.Workflow.Runtime.Hosting.SqlWorkflowPersistenceService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionString="[dbconnectionstring]" UnloadOnIdle="true"/>
        </Services>
    </RuntimeWithPersistence>
</configuration>    

我正在考虑这个问题以及我目前正在工作的一个项目。然而,在我看来,监控数据库的功能不是工作流的责任


我们将创建一个要添加到运行时的服务。此服务将引发工作流在HandleEventActivity中侦听的事件。这样,工作流就会闲置、持久化并一直保持这种状态,直到真正的工作真正需要完成。

感谢您的反馈!我也开始采用这种方法,但我试图找到另一个问题的优雅解决方案:监控者必须知道之前触发了哪些“触发器”,这样下次看到它时就不会再触发。这就是为什么我考虑将持久性与监视持久性结合使用,这样它就可以存储一个触发器列表,忽略它已经执行的操作。不过,我喜欢这个想法,并将对其进行更彻底的研究。我们也有同样的想法,但找到了一种简单可靠的方法来确定运行时是否已经有工作流的持久化实例(可能有;我们是工作流领域的相对初学者,从那时起我就没有进一步研究过它了……)
public class WorkflowHost
{
    private WorkflowRuntime _runtime = null;
    private WorkflowRuntime _nonPersistingRuntime = null;

    private void SetupRuntime()
    {
        // create a new WorkflowRuntime that points out a config section
        // defining a persistence service
        _runtime = new WorkflowRuntime("RuntimeWithPersistence");
        // set up additional services to use
        _runtime.StartRuntime()

        // create a new WorkflowRuntime that does not point out a config section
        _nonPersistingRuntime = new WorkflowRuntime();
        // set up additional services to use
        _nonPersistingRuntime.StartRuntime()
        // start monitoring workflows in the non persisting runtime
        StartMonitoringWorkflows(_nonPersistingRuntime);
    }
}