无法加载StateMachineStateTracker的实例.也许它在WF达到了最终状态

本文关键字:WF 状态 加载 StateMachineStateTracker 也许 实例 | 更新日期: 2023-09-27 18:27:37

首先,我对WorkFlow Foundation 4.5完全陌生。我们使用WF引擎来管理案例实体中的状态。我们没有构建自己的状态机,而是决定使用WF。主要是因为我们的客户有大量的流程(没有那么复杂),我们想在xaml中绘制这些流程。每个人都很容易真正理解这个过程并谈论它。

问题是,我们向最终状态Final的转换导致StateMachineStateTracker实例在加载时为null。下面的代码完全适用于所有转换,我们可以在恢复书签后加载tracker实例,以查看新的当前状态。

 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(活动进程、Case@Case、字符串转换){WorkflowApplicationInstance实例=null;使用(var store=new DisposableStore()){instance=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吗(不确定它是否真的达到了最终状态)。

有人知道这个问题的线索吗?我有一种感觉,这是一些基本的东西,我们已经忘记了。

无法加载StateMachineStateTracker的实例.也许它在WF达到了最终状态

好的。我发现了问题。就像我想的那样。没问题。只有我是WF的新手。当您转换到最终状态时,WF会删除案例完成后的所有数据。这意味着SurrogateInstance从DB中删除,状态机状态跟踪器当然不工作,因为没有加载到跟踪器中的情况。但是,我在WorkflowApplication的Completed事件上做了一个委托方法,可以处理闭包并完成我们的案例。

  wfApp.Completed = delegate(WorkflowApplicationCompletedEventArgs e)
        {
            Debug.WriteLine("Workflow completed.");
            Debug.WriteLine("State" + e.CompletionState);
            if (e.CompletionState == ActivityInstanceState.Closed)
            {
                _caseIsCompleted = true;
            }
        };