c# – 会话模式“ServerState”不能正确处理线程中的Session
发布时间:2020-12-15 21:47:45 所属栏目:百科 来源:网络整理
导读:我已经实现了一些工作,它为Thread内的Session状态添加了值.我希望这些值在Thread之外可用(显然). 当会话状态模式为“InProc”时,添加到会话的信息可在会话之外使用,而不会出现任何问题. 但是,当会话状态模式为“StateServer”时,行为是不同的.基本上,Thread
我已经实现了一些工作,它为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). 解决方法
我认为这是一个时间问题 – 在您设置标签值时,无法保证您的工作线程已经执行.需要几个MS才能创建并启动胎面.到那时,主线程的其余部分可能已经完成了.您可以通过调试输出并查看代码执行的顺序来测试它.
如果您需要保证线程中的代码执行(这消除了对线程的需要) – 您可以使用WaitOne()线程方法让主线程等待工作线程返回.但是,根据线程中设置的值在并行进程中可用是有风险的. 另外 – 恕我直言,我不会在ASP.NET应用程序中使用线程 – 我相信共识是??它们有点危险.我看到应用程序池崩溃是因为生成的线程中存在错误的代码. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |