首页 文章

工作流程已中止

提问于
浏览
0

我正在使用Asp .net应用程序,我正在使用Windows工作流基础4.当我终止工作流程时,我想用以下代码导出原因

app.Aborted = delegate(WorkflowApplicationAbortedEventArgs o)
        {

            HttpContext.Current.Response.Write("Exception:" + o.Reason.GetType().FullName + o.Reason.Message);
            syncEvent.Set();
        };

但我认为它不起作用,因为工作流没有HttpContext . 任何想法如何我出口?

2 回答

  • 0

    我认为最简单的方法是将WorkflowApplication和HttpContext包装在同一个类中,例如:

    class WorkflowAppAdapter
        {
            private HttpContext m_Context;
            private WorkflowApplication m_WorkflowApp;
    
            public WorkflowAppAdapter(WorkflowApplication app, HttpContext context)
            {
                m_Context = context;
                m_WorkflowApp = app;
    
                app.Completed =
                    (e) =>
                    {
                        Debug.WriteLine(m_Context.Request.Browser.Browser);
    
                    };
            }
    
            public void Run()
            {
                m_WorkflowApp.Run();
            }
        }
    
  • 0

    问题是HttpContext.Current是一个线程静态字段,其作用域是执行ASP.NET请求的当前线程,而WorkflowApplication在后台ThreadPool线程上运行工作流和回调 .

    您希望将错误写回响应流这一事实表明您正在使用短暂运行的工作流程 . 在这种情况下,使用WorkflowInvoker来运行工作流要容易得多,因为没有涉及后台线程 .

    如果您使用WorkflowApplication而不是我建议查看SynchronizationContext属性并设置它,那么大多数回调将被重新回到原始线程上 .

相关问题