WF4:当前应用程序域中的许多动态程序集?

时间:2010-08-31 09:19:43

标签: c# assemblies workflow-foundation workflow-foundation-4 workflow-activity

完整代码:

using System;
using System.Linq;
using System.Activities;
using System.Activities.Statements;

namespace ManyAssemblies {

  class Program {

    public sealed class SayHelloActivity : Activity {
      readonly WriteLine writeLine = new WriteLine() { Text = "Hello Workflow 4" };
      public SayHelloActivity() {
        Implementation = () => { return writeLine; };
      }
    }


    static void Main(string[] args) {
      var wfDefinition = new SayHelloActivity();

      for (int i = 0; i < 100; i++) {
        WorkflowInvoker.Invoke(wfDefinition);
      }

      var allLoadedAssemblies = AppDomain.CurrentDomain.GetAssemblies();
      int wfAssemblesCount = allLoadedAssemblies
        .Where(a => a.FullName == 
"Workflow, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").Count();
      Console.WriteLine(string.Format("There are {0} workflow assemblies in app domain.", wfAssemblesCount));
      Console.ReadLine();
    }
  }
}

此代码的输出:

...
Hello Workflow 4
Hello Workflow 4
Hello Workflow 4
There are 100 workflow assemblies in app domain.

每次执行wf定义都会创建在当前应用程序域中加载的新动态程序集。 为什么?定义总是一样的,所以这不是必要的,IMO。这是WF4的设计缺陷吗?可以控制这种行为吗?

我正在为工作流实例构建主机。这个主机必须启动并运行很长时间,比如几个月。即使只有很少的工作流程定义,我最终会得到包含数千个动态程序集的app域吗?这会扼杀我的表现并耗尽我的记忆吗?

1 个答案:

答案 0 :(得分:1)

事实证明这是因为附加了调试器。

如果我直接在命令提示符下运行代码,那么在app域中没有“Workflow,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = null”程序集。

有趣的是没有。

这是否意味着每个WorkflowInvoker.Invoke(wfDefinition);在实例竞争中卸载了动态组件的构建吗?

但这是一个实施细节,可能不会影响wf app的性能。

感谢你帮助tilovell