目前我有一个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} “没有页面网址的功能。
答案 0 :(得分:0)
找到了AutoResetEvent进入的解决方案。
在workflowapplication初始化期间,我添加了WorkflowApplication.Unloaded委托来发信号
AutoResetEvent
(wfApp.Unloaded = (a) => { waitHandler.Set(); };
)
并在恢复书签时,明确调用AutoResetEvent.WaitOne();
,
阻止HttpContext继续运行,直到我的工作流程被卸载或完成并返回结果。
workflow.ResumeBookmark(bMarkName, true);
AutoResetEvent.WaitOne();`