日期:2014-05-20  浏览次数:20507 次

多线程与Session的访问
网上可以搜索到很多关于通过asp.net长时间执行任务,通过多线程来解决的方法。
我的代码如下:其余多余代码省略
C# code
public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                if (Session["IsExecExport"] != null)
                {
                    TextBox1.Text = Session["IsExecExport"].ToString();
                }
            }
        }

        protected void Button2_Click(object sender, EventArgs e)
        {
            Response.Redirect("Default.aspx");
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
           System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(Add));
            //t.IsBackground = true;
            t.Start();
        }

        private void Add()
        {
            Session["IsExecExport"] = "1";
        }
    }

问题如下:
执行Add中访问Session的时候就抛出异常
:只有在配置文件或 Page 指令中将 enableSessionState 设置为 true 时,才能使用会话状态。还请确保在应用程序配置的 <configuration>\<system.web>\<httpModules> 节中包括 System.Web.SessionStateMod 或自定义会话状态模块。
及时在page中添加EnableSessionState="true" 和web.config中添加<pages enableSessionState="true" />也无济于事
web.config中sessionmode为StateServer或者Inproc都试过,也都会有这个错误。
请问如何在多线程内访问Session?
如果该session是在多线程内建立的,则抛出异常,如果是多线程外建立的是可以访问并且修改,但是修改是局部的,执行完后又变回去了。
百思不得其解,谁能说说其中的原理

------解决方案--------------------
楼主可以从这样来想,session其实对于一个多线称来说 是公共资源了,那么如果你在任意一个线程中调用它 , 就需要lock
------解决方案--------------------
我的问题解决了. 多线程是访问不到Session的. 我采用Cache解决了.