Workflow 4.0缓存元数据v / s缓存完整活动对象

时间:2013-01-24 23:25:18

标签: .net workflow-foundation-4

我想了解

  1. CacheMetadata与我自己的缓存中的缓存完整活动对象(某些集合)之间的区别
  2. 无论如何,我可以提高基于xaml的工作流程的性能。
  3. 我们有类似......

     public class BusinessRule
        {
            public DynamicActivity Activity { get; private set; }
            public BusinessRule(string ruleSetAsXaml)
            {
                Stream stream = new MemoryStream(ASCIIEncoding.Default.GetBytes(ruleSetAsXaml));
                this.Activity = ActivityXamlServices.Load(stream) as DynamicActivity;
            }

    public void Execute(data objData) { Dictionary<string, object> inArgs = new Dictionary<string, object>(); inArgs.Add("data", objData); if (this.Activity != null) { WorkflowInvoker invoker = new WorkflowInvoker(this.Activity); outArgs = invoker.Invoke(inArgs); } } }

    我们有很多这样的业务规则。 xamls存储在数据库中,所有这些规则都被实例化一次并保存在集合中(在内存中)。使用Execute()方法在需要时(使用附加参数)调用它们。

    现在我的问题......无论如何,我可以让WorkflowInvoker.Invoke()更快吗?目前,每次调用约需00:00:00.1214497次,CPU利用率为25%(在此线上)完整流程。还可以注意到我在xaml中没有做任何棘手的事。

    我在这里做错了吗?我是否需要缓存元数据?

1 个答案:

答案 0 :(得分:1)

1)

CacheMetadata不是您认为的那样。它在执行之前始终调用,用于构建活动的“表示”,以便它可以运行。这也是在执行时进行验证以防止错误的地方。它是CacheMetadata,设计人员使用它来显示您在视觉编辑工作流时看到的所有错误。

CacheMetadata已经过优化,不会在同一工作流实例上调用构建逻辑的某些部分。当然,每次运行都会调用它,主要是因为验证目的,但这就是WF4的性质。

2)

如果您真正缓存业务规则实例,那么您将无法大幅度提高时间。您已经在阻止XAML解析/读取,这实际上是所有事情中最耗费人力的部分。

如果您在工作流程中使用VB表达式,则需要编译它们,这需要时间。在WF4.5中,您可以使用C#表达式,这些表达式必须在执行之前进行主动编译,这是一个优点。查看更多信息here。这是我现在唯一想到的事情。