使用MVC的可持续工作流程 - 在完成时运行抛出异常

时间:2011-03-25 15:41:20

标签: asp.net-mvc-3 workflow workflow-foundation-4

我在MVC 3应用程序中运行了一个可持久的Workflow,运行良好,但是当工作流程完成时,会抛出WorkflowApplicationCompletedException。工作流程已成功完成,最后一个操作已完成,实例已从数据库中删除。

到目前为止,我没有找到答案的运气,所以任何想法导致异常都会受到赞赏。我目前的解决方法是捕获异常并在那里为OnCompleted-Event做我的工作。

我只是创建一个WorkflowApplication,加载它并恢复书签。

任何提示或建议表示赞赏。 感谢

application.Load(new Guid(basket.StandardFields.Settings));
application.ResumeBookmark(application.GetBookmarks().First().BookmarkName, WorkflowInputs);


application.PersistableIdle = delegate(WorkflowApplicationIdleEventArgs e)
{
    if (e.Bookmarks != null && e.Bookmarks.Count > 0)
    {
        _viewName = e.Bookmarks[0].BookmarkName;
    }

    syncContext.OperationCompleted();
    return PersistableIdleAction.Unload;
};

application.Completed = delegate (WorkflowApplicationCompletedEventArgs e)
{
    CompleteWorkflow(syncContext);
};

application.SynchronizationContext.OperationStarted();

try
{
    application.Run();
}
catch(WorkflowApplicationCompletedException)
{
    CompleteWorkflow(syncContext);
}

修改

似乎application.ResumeBookmark(书签,WorkflowInputs)启动工作流并完成活动,然后当我调用run时,它会抱怨它已经完成。但是如果我在调用resume工作流程时没有调用run,那么浏览器永远不会得到任何信息,我认为它会无休止地等待,因为即使刷新也无法将其从等待状态中解脱出来。

2 个答案:

答案 0 :(得分:1)

似乎使用ResumeBookmark后无需再调用Run。我想我之前在错误的地方做这件事,所以工作流程搞砸了,但现在似乎工作正常。

if(hasWorkflow)
    application.ResumeBookmark(application.GetBookmarks().First().BookmarkName, WorkflowInputs);
else
    application.Run();

答案 1 :(得分:0)

MSDN

  

表示异常   在工作流程上执行操作时抛出   实例无效,因为   实例已经完成。

您显示的代码似乎有效。但是,在某处您尝试恢复已进入已完成状态的工作流程。您应该检查您尝试恢复的任何工作流程的Completed属性。抛出一个InvalidOperationException,你会看到这发生了什么。

如果这无法确定问题所在,则您的工作流程可能无法正确添加书签。该代码位于创建书签的活动中,因此我无法判断它是否正确完成...