0

まず、WorkFlow Foundation 4.5 はまったくの初心者です。Case エンティティで状態を管理するために WF エンジンを使用します。独自のステート マシンを構築する代わりに、WF を使用することにしました。主な理由は、顧客が大規模なプロセス フロー (それほど複雑ではない) を持っているためで、それを xaml で描画したいと考えていました。誰もがプロセスを実際に理解し、それについて話すのは簡単です。

問題は、最終状態である Final 状態への遷移により、StateMachineStateTracker インスタンスをロードすると null になることです。以下のこのコードは、すべての遷移に対して完全に機能し、ブックマークを再開した後にトラッカー インスタンスをロードして、新しい現在の状態を確認できます。

 private void ConfigureWorkflowApplication(WorkflowApplication wfApp, SqlWorkflowInstanceStore store)
    {
        wfApp.InstanceStore = store;
        var tracker = new StateMachineStateTracker(wfApp.WorkflowDefinition);
        wfApp.Extensions.Add(tracker);
        wfApp.Extensions.Add(new StateTrackerPersistenceProvider(tracker));
        wfApp.Completed = delegate { Debug.WriteLine("Workflow completed."); };
        wfApp.Aborted =
            delegate(WorkflowApplicationAbortedEventArgs e)
            {
                Debug.WriteLine("Workflow Aborted. Exception: {0}\r\n{1}", e.Reason.GetType().FullName,
                    e.Reason.Message);
            };
        wfApp.OnUnhandledException = delegate(WorkflowApplicationUnhandledExceptionEventArgs e)
        {
            Debug.WriteLine("Unhandled Exception: {0}\r\n{1}", e.UnhandledException.GetType().FullName,
                e.UnhandledException.Message);
            return UnhandledExceptionAction.Terminate;
        };
        wfApp.PersistableIdle = delegate { return PersistableIdleAction.Unload; };
    }

上記のコードは、WorkFlowApplication インスタンスをインスタンス化します。

protected bool Execute(Activity process, Case @case, string transition) { WorkflowApplicationInstance インスタンス = null; using (var store = new DisposableStore()) { インスタンス = WorkflowApplication.GetInstance(@case.InstanceId, store.Store);

            var wfApp = new WorkflowApplication(process, WorkflowIdentity);
            ConfigureWorkflowApplication(wfApp, store.Store);
            var trackerInstance = StateMachineStateTracker.LoadInstance(@case.InstanceId, wfApp.WorkflowDefinition,
                _connectionString);
            if (!trackerInstance.Transitions.Any(x => x.DisplayName.Equals(transition))) return false; 
        }
        using (var store = new DisposableStore())
        {
            var wfApp = new WorkflowApplication(process, instance.DefinitionIdentity);
            ConfigureWorkflowApplication(wfApp, store.Store);
            wfApp.Load(@case.InstanceId);
            var sync = new AutoResetEvent(false);
            wfApp.ResumeBookmark(transition, null);
            wfApp.Unloaded = x => sync.Set();
            sync.WaitOne();

            // Set case to new state
            var trackerInstance = StateMachineStateTracker.LoadInstance(@case.InstanceId, wfApp.WorkflowDefinition,
                _connectionString);

            @case.ChangeToNewState(trackerInstance.CurrentState);
        }

        return true;
    }

上記のコードには、ある状態から次の状態への遷移 (文字列遷移) を作成する意図があり、新しい状態を Case クラスに設定する必要もあります。

最終状態の前の状態からこれを実行したい場合、これは失敗します。例外なし。出力ウィンドウにログインしません。何もない。ちょうどその行

var trackerInstance = StateMachineStateTracker.LoadInstance(@case.InstanceId, wfApp.WorkflowDefinition, _connectionString);

null を返します。これは、最終状態にあるインスタンスで StateMachineStateTracker をロードできないという事実によるものですか (実際に最終状態に達するかどうかは不明です)。

誰でも問題について手がかりを持っていますか? これは私たちが忘れてしまった基本的なことだと感じています。

4

1 に答える 1