代码之家  ›  专栏  ›  技术社区  ›  pero

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

  •  1
  • pero  · 技术社区  · 14 年前

    完整代码:

    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 domain吗?这会毁了我的表演,耗尽我的记忆吗?

    1 回复  |  直到 14 年前
        1
  •  1
  •   pero    14 年前

    原来这是因为附加了调试器。

    如果我直接在命令提示符下运行代码,在这种情况下,app domain中没有“Workflow,Version=0.0.0,Culture=neutral,PublicKeyToken=null”程序集。

    有趣的是没有。

    但这是一个实现细节,可能不会影响wf应用程序的性能。

    谢谢你的帮助