WCF中的workflowapplication和SynchronousSynchronizationContext

时间:2013-07-11 17:05:48

标签: wcf workflow-foundation-4 workflow-foundation

我正在使用WF 4.5实现一个stare机器应用程序;此工作流由使用WorkflowApplication类的WCF服务托管。它旨在供ASP.NET MVC应用程序使用,该应用程序查询WCF服务以重定向到映射到状态机工作流中定义的状态的特定页面。我需要工作流的执行应该是同步的,以便在调用转换时向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;
    }
}

我感谢所有人都能给我一些暗示我做错了什么。 谢谢和问候。

1 个答案:

答案 0 :(得分:1)

http://www.develop.com/synchworkflow的示例功能不全。同步上下文的实现仅处理从不同线程执行的空闲或中止事件之前的调用。 ResumeBookmark也是如此。 需要稍微复杂的同步上下文实现。 .net框架中有一个例子(尽管它是不能使用的私有类)。该类是System.Activities.WorkflowApplication,System.Activities中的PumpBasedSynchronizationContext。

与此类似的问题是:How to execute WorkflowApplication Synchronously