2

私は理解しようとしています

  1. CacheMetadata と自分のキャッシュ (一部のコレクション) での完全なアクティビティ オブジェクトのキャッシュの違い
  2. とにかく、xaml ベースのワークフローのパフォーマンスを向上させることができますか。

次のようなものがあります...

パブリック クラス ビジネスルール
    {
        public DynamicActivity アクティビティ { get; プライベートセット; }
        public BusinessRule(string ruleSetAsXaml)
        {
            ストリーム ストリーム = 新しい MemoryStream(ASCIIEncoding.Default.GetBytes(ruleSetAsXaml));
            this.Activity = ActivityXamlServices.Load(stream) as DynamicActivity;
        }

public void Execute(data objData) { Dictionary<string, object> inArgs = new Dictionary<string, object>(); inArgs.Add("data", objData); if (this.Activity != null) { WorkflowInvoker invoker = new WorkflowInvoker(this.Activity); outArgs = invoker.Invoke(inArgs); } } }

そして、このような多くのビジネス ルールがあります。xaml はデータベースに格納され、これらすべてのルールは一度インスタンス化され、コレクション (メモリ内) に保持されます。これらは、必要に応じて (追加の引数を使用して) Execute() メソッドを使用して呼び出されます。

今私の質問...とにかく私はWorkflowInvoker.Invoke()もっと速くすることができますか? 現在00:00:00.1214497、完全なプロセスの 25% の CPU 使用率 (この行で) で各呼び出しを行っています。また、xaml でトリッキーなことは何もしていないことに注意してください。

私はここで何か悪いことをしていますか? メタデータをキャッシュする必要はありますか?

4

1 に答える 1

2

1)

CacheMetadata は、あなたが思っているものではありません。これは常に実行前に呼び出され、実行の準備を整えるためにアクティビティの「表現」を構築するために使用されます。また、実行中のエラーを防ぐために検証が行われる場所でもあります。デザイナーがワークフローを視覚的に編集しているときに表示されるすべてのエラーを表示するために使用されるのは CacheMetadata です。

CacheMetadata は、同じワークフロー インスタンスでビルド ロジックの特定の部分を呼び出さないように既に最適化されています。もちろん、主に検証目的のため、実行ごとに常に呼び出されますが、それは WF4 の性質です。

2)

本当にビジネス ルール インスタンスをキャッシュしている場合、その時間を大幅に改善することはできません。あなたはすでに XAML の解析/読み取りを妨げています。これは、すべての中で最も労力のかかる部分です。

ワークフローで VB 式を使用している場合は、コンパイルする必要があり、時間がかかります。WF4.5 では、実行前にアクティブにコンパイルする必要がある C# 式を使用できます。これはプラスです。詳細はこちらをご覧ください。これは本当に今私の頭に浮かぶ唯一のものです。

于 2013-01-25T00:43:00.077 に答える