まず、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 をロードできないという事実によるものですか (実際に最終状態に達するかどうかは不明です)。
誰でも問題について手がかりを持っていますか? これは私たちが忘れてしまった基本的なことだと感じています。