完全なコード:
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 の設計上の欠陥ですか? この動作を制御できますか?
ワークフロー インスタンスのホストを構築しています。そして、このホストは、数か月のように長期間稼働している必要があります。ワークフロー定義がほんの少ししかない場合でも、何千もの動的アセンブリを含むアプリ ドメインになるのでしょうか? これにより、パフォーマンスが低下し、メモリが消費されますか?