2

我试图理解

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

我们有类似...

公共类 BusinessRule
    {
        公共动态活动活动{获取;私人套装;}
        公共业务规则(字符串规则SetAsXaml)
        {
            流流 = 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 中没有做任何棘手的事情。

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

4

1 回答 1

2

1)

CacheMetadata 不是你想象的那样。它总是在执行之前被调用,并用于构建您的活动的“表示”以使其准备好运行。这也是进行验证以防止执行时出错的地方。设计师使用 CacheMetadata 来显示您在可视化编辑工作流时看到的所有错误。

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

2)

如果您真的在缓存业务规则实例,那么您将无法大幅缩短该时间。您已经在阻止 XAML 解析/读取,这实际上是所有事情中最劳动密集型的部分。

If you're using VB expressions on your workflows they've to be compiled, and that takes time. In WF4.5 you can use C# expressions which have to be actively compiled prior to execution, which is a plus. Check more info here. This is really the only thing that comes to my mind right now.

于 2013-01-25T00:43:00.077 回答