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的示例功能不完整。同步上下文的实现只处理调用,直到从不同线程执行的空闲或中止事件。简历书签也是如此。需要更复杂的同步上下文实现。.net 框架中有一个示例(尽管它是不能使用的私有类)。该类是 System.Activities.WorkflowApplication、System.Activities 中的 PumpBasedSynchronizationContext。

与此类似的问题是:如何同步执行 WorkflowApplication

于 2013-07-19T13:34:54.420 回答