WF4: Много динамических сборок в текущем домене приложения? - PullRequest
1 голос
/ 31 августа 2010

Полный код:

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 создает новую динамическую сборку, которая загружается в текущий домен приложения.Зачем?Определение всегда одно и то же, поэтому в этом нет необходимости, ИМО.Это недостаток дизайна в WF4?Можно ли управлять этим поведением?

Я создаю хост для экземпляров рабочих процессов.И этот хост должен работать долго, например, месяцы.Получу ли я домен приложения со многими тысячами динамических сборок, даже если существует всего несколько определений рабочих процессов?Это убьет мою работу и израсходует мою память?

1 Ответ

1 голос
/ 01 сентября 2010

Оказывается, это из-за подключенного отладчика.

Если я запускаю код непосредственно в командной строке, в этом случае в домене приложения не было сборок «Workflow, версия = 0.0.0.0, Culture = нейтральный, PublicKeyToken = null».

Интересно, что нет ни одного.

Означает ли это, что на каждом WorkflowInvoker.Invoke (wfDefinition); есть сборка динамической сборки, которая выгружается при конкуренции экземпляров?

Но это деталь реализации, которая, вероятно, не влияет на производительность wf-приложения.

Спасибо за помощь, tilovell

...