完整代码:
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吗?这会毁了我的表演,耗尽我的记忆吗?