【问题标题】:move time consuming operations out of page load将耗时的操作移出页面加载
【发布时间】:2010-09-03 06:31:02
【问题描述】:

我有一个 aspx 页面,我可以在其中动态创建报告和图表。创建这些图表和报告需要花费大量时间,因此在创建完成之前会向用户显示一个空白屏幕。

为了解决这个问题,我试图在页面加载时在单独的线程中触发报告生成,当报告生成完成时,我试图设置一个会话变量来指示完成。我有一个 AJAX 计时器,它会不断检查这个标志。

protected void Page_Load( object sender, EventArgs e )
{
    if ( !IsPostBack )
    {
        ThreadPool.QueueUserWorkItem( new WaitCallback( DoLongRunningProcess ) );
    }
}
public void GenerateReport( object state )
{
    ///generate report
    Session[ "done" ] = true;
}

问题是 Session 为 null(Session 状态只能在 enableSessionState 设置为 true 时使用,无论是在配置文件中还是在 Page 指令中。还请确保 System.Web.SessionStateModule 或当我尝试设置完成标志时,自定义会话状态模块包含在应用程序配置的 \\ 部分中。)。

你们能告诉我如何解决这个问题吗?

【问题讨论】:

    标签: asp.net asp.net-ajax


    【解决方案1】:

    问题是在一个新线程中,HttpContext.Current(和其中的 Session)不可用。

    一种解决方案是创建一个您在 Session 中噘嘴的实例,并将工作线程作为参数感知:

    1. 声明一个状态类:

      公共类我的状态{ 公共异常异常{get;放; } 公共布尔 IsDone { 得到;放; } }

    2. 在开始处理之前,在 Session 中放置一个您的 ajax 回调可以检查的实例。还将对象作为参数提供给工作线程。

      protected void Page_Load(object sender, EventArgs e) { if ( !IsPostBack ) { 我的状态我的状态 = 新的我的状态(); 会话[“我的状态”] = 我的状态; ThreadPool.QueueUserWorkItem(DoLongRunningProcess , myStatus ); } }

    3. 在您的工作线程中,设置处理完成的标志。

      public void GenerateReport(对象状态) { MyStatus myStatus = 状态为 MyState;

      ///generate report
      myStatus.IsDone = true;
      

      }

    4. 在您的 ajax 回调中,检查状态。如果你完成了,还要从 Session 中删除状态。

      MyStatus myStatus = Session["MyStatus"] as MyState; 如果(myStatus.IsDone) { // 做点什么。

      // cleanup.
      Session.Remove("MyStatus");
      

      }

    【讨论】:

      【解决方案2】:

      尝试在该标签部分添加到 web.config:

      <add name="Session" type="System.Web.SessionState.SessionStateModule" />
      

      在某些情况下您需要添加删除标签

      <remove name="Session" />
      <add name="Session" type="System.Web.SessionState.SessionStateModule" />
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-16
        • 2014-03-25
        • 1970-01-01
        • 2021-03-17
        • 2018-05-21
        • 1970-01-01
        • 2013-01-12
        • 2014-04-27
        相关资源
        最近更新 更多