gpt4 book ai didi

asp.net - 由线程更新的 Asp .net session 变量未反射(reflect)在 Session 中

转载 作者:行者123 更新时间:2023-12-01 05:21:16 26 4
gpt4 key购买 nike

在我的 page1.aspx 中,我使用线程从数据库生成报告。

//on button click
Hashtable ht = (Hashtable)Session["ReportParam"];
ReportThreadClass rth = new ReportThreadClass(ht);
Thread thread = new System.Threading.ThreadStart(rth .Run);
thread.Start();

在我的线程类的 rum 方法中,我正在更新 Hashtable 中的值,即我创建了多少页。
//in thread' method        
public virtual void Run()
{
int pagecount=0;
while(done)
{
//loading data from DB and generating html pages

ht["Total_Pages"] = pagecount;
}
}

在我的 Page2.aspx 我正在从 session 变量中读取值
Hashtable ht = (Hashtable)Session["ReportParam"];
int TotalPages = (int) ht["Total_Pages"];

当我在 InProc 模式下运行上面的代码时,一切正常,我从 session 中获取更新的值。
因为每件事都存储在静态变量中,并且 ht 被 Session 引用,所以它会在 session 中自动更新(不需要将 HashTable 重新分配给 session )。

但是当我在状态服务器(OutProc 模式)中运行代码时,它需要通过序列化哈希表将 session 数据存储在不同的进程中。

但是即使在 Thread 完全运行之后,Total_Pages 的值也不会在 Page2.aspx 中更新。

那么是否有任何事件或方法被触发以将 session 变量中的所有更新存储到 State-Server ,如果是,请告诉我。如果没有,请建议我在 page2.aspx 中获取更新值。

最佳答案

我会像这样明确地 SET 和 GET SessionState:

在你的线程运行

// no complex object like hastable, just a plain value...
Session["pageCount"] = pageCount;

在您的 page2.apsx 中:
var pageCount = (int) Session["pageCount"]??0;

您的报告线程在使用进程外 session 状态时未更新其 session 值的原因是因为 session 无法检测哈希表的值已更改,因此它不会使用序列化版本更新底层存储仓促。当您明确存储一个不可变对象(immutable对象)时,它将持久化一个它的值已更改;

由于当您的线程完成时 session 可能已经消失,所以一个更好的选择是获取对 SqlSessionStateStore 的引用并调用 SetAndReleaseItemExclusive。最终,您可能希望拥有一个可以处理您的场景的重载 SessionStateProvider。

关于asp.net - 由线程更新的 Asp .net session 变量未反射(reflect)在 Session 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16589578/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com