Не удается загрузить экземпляр StateMachineStateTracker. Может быть, его достичь конечного состояния в WF
Во-первых, я совершенно новичок в WorkFlow Foundation 4.5. Мы используем движок WF для управления состояниями в наших сущностях Case. Вместо того, чтобы строить наш собственный конечный автомат, мы решили использовать WF. Главным образом из-за того, что у нашего клиента большие технологические потоки (не такие сложные), которые мы хотели нарисовать в xaml. Легко для всех, чтобы на самом деле понять процесс и поговорить об этом.
Проблема состоит в том, что наши переходы в конечное состояние, конечное состояние, приводят к тому, что экземпляр StateMachineStateTracker равен нулю, когда мы его загружаем. Приведенный ниже код отлично работает для всех переходов, и мы можем загрузить экземпляр трекера после возобновления закладки, чтобы увидеть, каково новое текущее состояние.
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.
Защищенное bool Execute(процесс Activity, Case @case, переход на строку) { WorkflowApplicationInstance instance = null; using (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 с экземпляром, который находится в конечном состоянии (не уверен, действительно ли он достигает конечного состояния).
У кого-нибудь есть какие-либо понятия о проблеме? У меня такое ощущение, что это нечто базовое, что мы забыли.
1 ответ
Хорошо. Я нашел проблему. Это было так, как я. Не проблема. Только я новичок на 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;
}
};