【问题标题】:Should I reuse a workflow definition?我应该重用工作流定义吗?
【发布时间】:2017-10-09 07:54:55
【问题描述】:

我们有一个 Web 应用程序,它必须在给定时间内执行数十或数百个工作流。经过数小时后,我们知道性能瓶颈是工作流的反序列化(我们将 xaml 保存在数据库中):

ActivityXamlServices.Load(xamlReader, activityXamlServicesSettings);

所以我们正在考虑缓存工作流(由 Load 方法返回的生成的 Activity 对象)。这似乎大大提高了性能。我能看到的唯一可能的问题是活动(来自工作流定义/树)将在工作流实例之间重用。因此,如果一个活动在一个实例中改变了状态,它可能会改变另一个正在运行的实例的行为。

注意:工作流变量似乎没有在工作流实例之间共享。

编辑:有人问过类似的问题:Workflow 4 runtime compiling。问题所有者似乎已经达到了“缓存DynamicActivity”(Load方法返回的活动)的相同解决方案。

【问题讨论】:

    标签: .net workflow-foundation-4


    【解决方案1】:

    是的,您绝对可以根据需要多次重复使用从反序列化的 XAML 返回的动态活动对象。您可以使用它来启动任意数量的 WorkflowApplication 对象。

    {编辑}

    通过反序列化 XAML 文档获得的活动对象只是工作流的蓝图。它不包含任何状态信息,因此可以根据需要多次重复使用以从(甚至是 WorkflowInvoker 实用程序类)创建 WorkflowApplication 实例。

    {endEdit}

    【讨论】:

    • 虽然到目前为止这个缓存在我们的系统中似乎工作得很好,但我们希望不存在边缘情况问题。我担心的是 Activity 对象(在加载工作流时创建)在工作流实例之间重用,如果 Activity 具有状态,那么这可能是一个问题(一个实例可能会改变另一个实例的行为)。
    • 通过反序列化 XAML 文档获得的活动对象只是工作流的蓝图。它不包含正在运行的工作流的“状态”信息。因此,您可以很好地缓存该活动对象以供重复使用。我将更新我的答案以反映这一点信息。
    • 我在官方 WF 文档站点中没有看到任何提及成为蓝图的内容。你有任何代码或官方文档链接吗?我在自定义活动中使用日志时观察到的是,它有时会创建自定义活动的新对象,但有时会将它们重用于不同的工作流实例。我觉得有一种模式,但仍在调查中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    • 1970-01-01
    • 2015-11-06
    • 1970-01-01
    • 2019-10-30
    • 2012-08-07
    相关资源
    最近更新 更多