我已经实现了一些工作,它为Thread内的Session状态添加了值.我希望这些值在Thread之外可用(显然).
当会话状态模式为“InProc”时,添加到会话的信息可在会话之外使用,而不会出现任何问题.
但是,当会话状态模式为“StateServer”时,行为是不同的.基本上,Thread内部设置的值有时会持久存在,有时则不会.对我来说似乎是随机的.
这是重现问题的代码.
public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender,EventArgs e) { } protected void store_Click(object sender,EventArgs e) { // Set the session values to default. Session["Test1"] = "No"; Session["Test2"] = "No"; // Set the Test1 session value in the thread. Threadobject threadobject = new Threadobject() { Username = Page.User.Identity.Name,SessionState = Session }; worker = new Thread(new ParameterizedThreadStart(Work)); worker.Start(threadobject); // Set the Test2 session value in this thread just to compare. Session["Test2"] = "Yes"; } protected void print_Click(object sender,EventArgs e) { // Print out the Session values. label1.Text = string.Empty; label1.Text += "Inside Thread: " + Session["Test1"] + ",\n"; label1.Text += "Outside: " + Session["Test2"] + "\n"; } private static Thread worker; public static void Work(object threadobject) { // Retrieve the Session object and set the Test2 value. Threadobject threadobject1 = (Threadobject)threadobject; HttpSessionState currentSession = threadobject1.SessionState; currentSession["Test1"] = "Yes"; } } public class Threadobject { public string Username { get; set; } public HttpSessionState SessionState { get; set; } }
上面的代码适用于SessionState mode =“InProc”,但是随机的:
<sessionState mode="StateServer" stateConnectionString="tcpip=localhost:42424" cookieless="false" timeout="20"/>
有任何想法吗?
编辑:因此,根据下面的评论,线程需要在请求(主线程)完成之前完成,否则添加到会话的任何内容都将丢失.这是因为在主线程结束时,会话被序列化并发送到数据存储(进程外或sql Server).
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。