如何使用WF4和ASP.NET线程进行操作

时间:2013-06-11 05:08:14

标签: asp.net workflow-foundation-4

目前我有一个ASP.NET webform应用程序,它与我的自定义工作流程协作。 我面临来自ASP.NET的httpcontext和活动上下文(NativeActivityContext)之间的线程的计时问题。

我的工作流具有实现SqlWorkflowInstanceStore的持久性能力。

下面的代码是我的工作流程中的一个活动,它正在执行类似页面导航的操作,并通过扩展名返回所需页面的URL(PageNavigationExtension)。

protected override void Execute(NativeActivityContext context)
{

    string bookmarkName = this.BookmarkName.Get(context);
    string urlPage = this.UrlPage.Get(context);
    bool createBookmark = this.CreateBookmark.Get(context);



    if (urlPage == null)
    {
        throw new ArgumentException(
            string.Format("UrlPage {0}: UrlPage can't be null",
                          this.DisplayName), "UrlPage");
    }
    if (bookmarkName == null)
    {
        throw new ArgumentException(
            string.Format("Bookmark {0}: BookmarkName can't be null",
                          this.DisplayName), "Bookmark");
    }
    innerExecute(context);
    if (createBookmark)
        context.CreateBookmark(bookmarkName, new BookmarkCallback(ResumerBookmark)); ;
}

private void innerExecute(NativeActivityContext context) {
    PageNavigationExtension extension =
            context.GetExtension<PageNavigationExtension>();
    if (extension != null)
    {
        extension.Url = UrlPage.Get(context);
        extension.ObjToReturn = ObjToReturn.Get(context);
    }

}

void ResumeBookmark(NativeActivityContext context, Bookmark bookmark, object state)
{
    bool action = (bool)state;


    if (action == true) {
        PageNavigationExtension extension =
            context.GetExtension<PageNavigationExtension>();
        if (extension != null)
        {
            extension.Url = UrlPage.Get(context);
            extension.ObjToReturn = ObjToReturn.Get(context);
        }
    }
    else
    {
        PageNavigationExtension extension = context.GetExtension<PageNavigationExtension>();
        context.SetValue(base.Result, action);
        context.SetValue(ObjToReturn, extension.ObjToReturn);
    }
}

下面显示的部分是我的ASPX页面的一部分,它恢复到活动(上面显示的代码)。

 public string directNavigate(string bMarkName) {
    WorkflowApplication workflow = GetWorkflow(null);
    workflow.Load(this.WorkflowID);
    workflow.ResumeBookmark(bMarkName, true);

    return pageNaviExtension.Url;
}

在我的“directNavigate”函数中恢复书签时出现问题,活动上下文没有调用“ResumeBookmark”BookmarkCallback委托,直到“return pageNaviExtension.Url;”的行, acititycontext线程只需转到我的“bool action = (bool)state;”BookmarkCallback委托的“ResumeBookmark”行。

简而言之,这意味着我无法通过我的活动在“return pageNaviExtension.Url;”行中返回页面网址,最后,我的ASPX页面的HttpContext的线程退出“{{1} “没有页面网址的功能。

1 个答案:

答案 0 :(得分:0)

找到了AutoResetEvent进入的解决方案。

在workflowapplication初始化期间,我添加了WorkflowApplication.Unloaded委托来发信号

AutoResetEventwfApp.Unloaded = (a) => { waitHandler.Set(); };

并在恢复书签时,明确调用AutoResetEvent.WaitOne();

阻止HttpContext继续运行,直到我的工作流程被卸载或完成并返回结果。

workflow.ResumeBookmark(bMarkName, true);
AutoResetEvent.WaitOne();`