1

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;
    }
}

私が間違っていることについて、みんなが私にヒントをくれることに感謝します。ありがとうございます。

4

1 に答える 1

1

http://www.develop.com/synchworkflowの例は完全には機能しません。同期コンテキストのその実装は、異なるスレッドから実行される Idle または Abort イベントまでの呼び出しのみを処理します。ResumeBookmark も同様です。同期コンテキストのもう少し複雑な実装が必要です。.net フレームワークに例があります (使用できないプライベート クラスですが)。クラスは、System.Activities.WorkflowApplication、System.Activities の PumpBasedSynchronizationContext です。

これと同様の質問は次のとおりです: WorkflowApplication を同期的に実行する方法

于 2013-07-19T13:34:54.420 に答える