我想了解
我们有类似......
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中没有做任何棘手的事。
我在这里做错了吗?我是否需要缓存元数据?
答案 0 :(得分:1)
1)
CacheMetadata不是您认为的那样。它在执行之前始终被调用,用于构建活动的“表示”,以便它可以运行。这也是在执行时进行验证以防止错误的地方。它是CacheMetadata,设计人员使用它来显示您在视觉编辑工作流时看到的所有错误。
CacheMetadata已经过优化,不会在同一工作流实例上调用构建逻辑的某些部分。当然,每次运行都会调用它,主要是因为验证目的,但这就是WF4的性质。
2)
如果您真正缓存业务规则实例,那么您将无法大幅度提高时间。您已经在阻止XAML解析/读取,这实际上是所有事情中最耗费人力的部分。
如果您在工作流程中使用VB表达式,则需要编译它们,这需要时间。在WF4.5中,您可以使用C#表达式,这些表达式必须在执行之前进行主动编译,这是一个优点。查看更多信息here。这是我现在唯一想到的事情。