加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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应用程序中使用线程 – 我相信共识是??它们有点危险.我看到应用程序池崩溃是因为生成的线程中存在错误的代码.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读