0

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

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

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

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;ResumeBookmark”书签回调委托。

简而言之,这意味着我无法在“ return pageNaviExtension.Url;”行期间通过我的活动返回页面 url,并且最后我的 ASPX 页面的 HttpContext 线程退出“ directNavigate”函数而没有页面 url。

4

1 回答 1

0

找到了 AutoResetEvent 的解决方案。

在工作流应用程序初始化期间,我添加了 WorkflowApplication.Unloaded 委托以发出信号

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

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

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

workflow.ResumeBookmark(bMarkName, true);
AutoResetEvent.WaitOne();` 
于 2013-06-12T04:34:19.093 回答