Не удается загрузить экземпляр StateMachineStateTracker. Может быть, он достигнет конечного состояния в WF

Во-первых, я совершенно не знаком с WorkFlow Foundation 4.5. Мы используем механизм WF для управления состояниями в наших сущностях Case. Вместо создания собственного конечного автомата мы решили использовать WF. В основном из-за того, что у нашего клиента большие потоки процессов (не такие уж сложные), которые мы хотели нарисовать в xaml. Всем легко понять процесс и рассказать о нем.

Проблема в том, что наши переходы в конечное состояние, конечное состояние, приводят к тому, что экземпляр 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 (процесс действия, случай @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);

Возвращает ноль. Это связано с тем, что вы не можете загрузить StateMachineStateTracker с экземпляром, который находится в конечном состоянии (не уверен, что он действительно достигает конечного состояния).

Кто-нибудь знает о проблеме? У меня такое чувство, что это что-то основное, что мы забыли.


person Magnus Backeus    schedule 22.10.2014    source источник


Ответы (1)


Ok. Я нашел проблему. Хотя было как у меня. Не проблема. Просто я новичок в WF. Когда вы выполняете переходы в конечное состояние, WF удаляет все данные о кейсе с момента его завершения. Это означает, что SurrogateInstance удаляется из БД, а средство отслеживания состояния конечного автомата, конечно же, не работает, так как нет случая для загрузки в средство отслеживания. НО, однако, я сделал метод делегата для события Completed для WorkflowApplication, который может обрабатывать закрытие и завершать наш случай.

  wfApp.Completed = delegate(WorkflowApplicationCompletedEventArgs e)
        {
            Debug.WriteLine("Workflow completed.");
            Debug.WriteLine("State" + e.CompletionState);
            if (e.CompletionState == ActivityInstanceState.Closed)
            {
                _caseIsCompleted = true;
            }
        };
person Magnus Backeus    schedule 27.10.2014
comment
Мне нужен DisposableStore, вы можете отправить мне - person Mohammad Bigdeli; 22.07.2019