积极答复者
多线程下如何共享主线程的session?

问题
-
在web下面,我要用n个线程来下载同一个文件,每个进程负责下载文件的一个片段,这个下载文件片段的函数里面包含用户登陆的认证,如果没有登陆,不给下载,可是我发现,用了多线程以后,每个线程共享不到主线程的session,也就是之前登陆创建的session在每个进程下访问不到
http://www.mapgou.cn
答案
-
这是可行的如下代码----------------------------------------------
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Threading; public partial class Default8 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { // 设置 Session Session["IsLogin"] = true; List<Thread> lst = new List<Thread>(); for (int i = 0; i < 5; i++) { Thread t = new Thread(new ThreadStart(DoWork)); t.Name = string.Format("Thread-{0}", i); lst.Add(t); } foreach (Thread t in lst) { t.Start(); } } private void DoWork() { while (true) { if (Session["IsLogin"] != null) { Boolean IsLogin = (Boolean)Session["IsLogin"]; } String CurrentThreadName = Thread.CurrentThread.Name; Thread.Sleep(1000); } } }
知识改变命运,奋斗成就人生!- 已标记为答案 肖小勇Moderator 2009年9月11日 1:11
全部回复
-
既然要在多个帐号间共享可以考虑 Cache 或 Application
知识改变命运,奋斗成就人生!
Application 是全局的,我意思一个用户,登陆后,信息保存session里面,当他多线程下载文件时,如何让每个线程都可以共享他登陆的session信息
http://www.mapgou.cn -
先成功登录后再开启多个线程
【孟子E章】我再把我的问题简化下,简化代码如下:if(Session["_xx_xxx_xx"] != null)//主线程的if语句,在登陆成功后,这个if会返回true{//开启10个线程(每个线程调用函数Run);......}//每个线程调用的方法void Run(){if(Session["_xx_xxx_xx"] != null)//线程的回话,即使登陆后,这个if语句也总是返回false,所以里面的代码不能执行{//开始下载文件(登陆用户才能下载,所以我做了限制);......}}我个人的理解,主线程创建的线程已经是另外的回话了,所以不能共用,不知道有啥办法可以共享主线程的session
http://www.mapgou.cn -
这是可行的如下代码----------------------------------------------
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Threading; public partial class Default8 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { // 设置 Session Session["IsLogin"] = true; List<Thread> lst = new List<Thread>(); for (int i = 0; i < 5; i++) { Thread t = new Thread(new ThreadStart(DoWork)); t.Name = string.Format("Thread-{0}", i); lst.Add(t); } foreach (Thread t in lst) { t.Start(); } } private void DoWork() { while (true) { if (Session["IsLogin"] != null) { Boolean IsLogin = (Boolean)Session["IsLogin"]; } String CurrentThreadName = Thread.CurrentThread.Name; Thread.Sleep(1000); } } }
知识改变命运,奋斗成就人生!- 已标记为答案 肖小勇Moderator 2009年9月11日 1:11
-
这是可行的如下代码
----------------------------------------------using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Threading; public partial class Default8 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { // 设置 Session Session["IsLogin"] = true; List<Thread> lst = new List<Thread>(); for (int i = 0; i < 5; i++) { Thread t = new Thread(new ThreadStart(DoWork)); t.Name = string.Format("Thread-{0}", i); lst.Add(t); } foreach (Thread t in lst) { t.Start(); } } private void DoWork() { while (true) { if (Session["IsLogin"] != null) { Boolean IsLogin = (Boolean)Session["IsLogin"]; } String CurrentThreadName = Thread.CurrentThread.Name; Thread.Sleep(1000); } } }
知识改变命运,奋斗成就人生!
你的代码,很接近我的代码,测试是成功的。但是,你试试再将你的DoWork方法放到别的类文件里面,就不能运行啦。我发现通过web启动多线程,多线执行的代码就想控制台代码一样,HttpContext.Current始终为null,所以session对象也是没有实例化的,我看我的想法是行不通了,用session保存回话状态不行
http://www.mapgou.cn