我有一个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为空(会话状态只能在enableSessionState设置为true时使用,无论是在配置文件中还是在Page指令中。还请确保System.Web.SessionStateModule或者自定义会话状态模块包含在应用程序配置的< configuration> \< system.web> \< httpModules>部分。)中,当我尝试设置完成标志时。
你能告诉我如何解决这个问题。
答案 0 :(得分:1)
问题是在新线程中,HttpContext.Current(及其中的Session)不可用。
一种解决方案是创建一个在Session中pout的实例,并将工作线程作为参数感知:
声明一个Status类:
公共类MyStatus { public Exception Exception {get;组; } 公共布尔IsDone {get;组; } }
在开始处理之前,在ajax回调可以检查的Session中放置一个实例。还将对象作为工作线程的参数。
protected void Page_Load(object sender,EventArgs e) { if(!IsPostBack) { MyStatus myStatus = new MyStatus(); 会话[“MyStatus”] = myStatus; ThreadPool.QueueUserWorkItem(DoLongRunningProcess,myStatus); } }
在您的工作线程中,设置处理完成的标志。
public void GenerateReport(object state) { MyStatus myStatus =状态为MyState;
///generate report
myStatus.IsDone = true;
}
在您的ajax回调中,检查状态。如果您已完成,还会从会话中删除状态。
MyStatus myStatus = Session [“MyStatus”]为MyState; if(myStatus.IsDone) { //做点什么。
// cleanup.
Session.Remove("MyStatus");
}
答案 1 :(得分:-1)
尝试在标记为
的部分中添加到web.config<add name="Session" type="System.Web.SessionState.SessionStateModule" />
在某些情况下,您需要添加删除标记 p>
<remove name="Session" />
<add name="Session" type="System.Web.SessionState.SessionStateModule" />