我已经实现了一些为线程内的会话状态添加值的工作。我希望这些值在线程之外可用(显然)。
当 Session State 模式为“InProc”时,添加到 Session 的信息在 Session 之外可用,没有任何问题。
但是,当会话状态模式为“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)。