1

完全なコード:

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 の設計上の欠陥ですか? この動作を制御できますか?

ワークフロー インスタンスのホストを構築しています。そして、このホストは、数か月のように長期間稼働している必要があります。ワークフロー定義がほんの少ししかない場合でも、何千もの動的アセンブリを含むアプリ ドメインになるのでしょうか? これにより、パフォーマンスが低下し、メモリが消費されますか?

4

1 に答える 1

1

これは付属のデバッガが原因であることが判明しました。

コマンド プロンプトでコードを直接実行すると、アプリ ドメインに "Workflow, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" アセンブリがありませんでした。

無いのが面白い。

これは、すべての WorkflowInvoker.Invoke(wfDefinition); でということですか? インスタンスの競合時にアンロードされる動的アセンブリの構築はありますか?

しかし、これはおそらく wf アプリのパフォーマンスに影響を与えない実装の詳細です。

助けてくれてありがとう

于 2010-09-01T07:03:21.557 に答える