WF 4.5 を使用して凝視マシン アプリケーションを実装しています。このワークフローは、WorkflowApplication クラスを使用して WCF サービスによってホストされます。これは、ステート マシン ワークフローで定義された状態にマップされた特定のページにリダイレクトするために WCF サービスを照会する ASP.NET MVC アプリケーションによって使用されることを意図しています。トランジションが呼び出されたときに MVC アプリケーションに現在の状態を与えるには、ワークフローの実行を同期させる必要があります。この記事で説明されているように、SynchronousSynchronizationContext を強制しています。
http://www.develop.com/synchworkflow
しかし、私は奇妙な振る舞いに直面しています。初めてワークフロー アプリケーションを呼び出すと、すべてが正常に機能し、ワークフロー アプリケーションはそのタスクを同期的に実行します。ただし、ブックマークを介して再開を呼び出すと (ワークフローは永続化されます)、ワークフローアプリケーションは非同期ファッションイベントで実行されますが、同期 SynchronizationContext を強制しています。
以下は、私が使用しているコードの抜粋です。
public class WorkflowManager
{
public Guid Run(Activity activity, IDictionary<string, object> parameters)
{
WorkflowApplication wfApp = SetUpInstance(activity, parameters);
wfApp.Run();
return wfApp.Id;
}
public void Resume(Guid id, Activity activity, string bookmarkName)
{
WorkflowApplication wfApp = SetUpInstance(activity, null);
wfApp.Load(id);
wfApp.ResumeBookmark(bookmarkName, "test");
}
WorkflowApplication SetUpInstance(Activity activity, IDictionary<string, object> parameters)
{
Guid id = Guid.Empty;
WorkflowApplication wfApp = null;
if (parameters != null)
{
wfApp = new WorkflowApplication(activity, parameters);
}
else
{
wfApp = new WorkflowApplication(activity);
}
SynchronousSynchronizationContext syncContext = new SynchronousSynchronizationContext();
wfApp.SynchronizationContext = syncContext;
wfApp.Idle = AppIdle;
wfApp.PersistableIdle = (e) =>
{
return PersistableIdleAction.Unload;
};
wfApp.Aborted = AppAborted;
wfApp.OnUnhandledException = AppException;
ChangedStateNotifier extensionNotifier = new ChangedStateNotifier();
extensionNotifier.Notification += delegate(object sender, HostNotifyEventArgs e)
{
if (ChangedState != null)
{
ChangedState(e.WorkflowId, e.WorkflowStatus);
}
};
wfApp.InstanceStore = store;
wfApp.Extensions.Add(extensionNotifier);
return wfApp;
}
}
私が間違っていることについて、みんなが私にヒントをくれることに感謝します。ありがとうございます。