从后台线程访问SessionState

问题描述:

我有一个执行长时间运行任务的asp.net页面。所以我在一个单独的线程中执行任务并定期轮询页面以检查状态。从后台线程访问SessionState

public partial class ResultPage : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     Thread t = new Thread(new ThreadStart(delegate() 
     { 
     ProcessItems(parameters); 
     })); 
     t.Name = "ThreadInfoPathProcess"; 
     t.Priority = ThreadPriority.Normal; 
     t.Start(); 
    } 

    private void ProcessItems(Parameters params) 
    { 
     // 
     //some code 
     // 

     //save the result in session and take it from another page 
     lock (this.Session.SyncRoot) 
     this.Session[resultid] = result; 
    } 
} 

但是当我从其他页面访问会话时,我将会话变量设置为空。这里可能是什么问题?

+0

页面调用的顺序是什么? – oleksii 2011-05-28 11:44:33

+0

该页面有一个asp定时器控件,该控件返回页面并检查线程的状态。线程从页面开始并将结果更新为会话状态。在timer_tick中,我检查线程是否已完成运行,并重定向到另一页。从新页面读取会话状态以获得线程给出的结果并对其进行处理。 – NLV 2011-05-28 11:50:07

正确的方法是创建Windows服务,您将通过远程调用Web应用程序(WCF - 可以是本地通过命名管道)安排您的长时间运行的进程。然后你的计时器将把这个页面合并到一起,这个页面可以将Windows服务池或者检查一些状态记录与数据库中的结果进行比较。