多用户同时搜索时, 搜索的参数如何维持各个用户的搜索状态呢?
前情提要: 一个客户资料管理系统, 所有的客户资料共享, 任意查阅问题描述: 当A用户搜索: "广州"的同时, B用户搜索: "深圳", 结果是A用户的搜索也变成了深圳, 两个用户的不能保持各自的状态
下面是关键的代码, 估计是分页参数的问题, 但是没有经验, 不知该如何修改, 请大家帮帮忙, 谢谢.
C# Code
public partial class SupplierInfo : MacBase
{
// 分页参数
public static int myPage;
public static string mySearchKeyword;
public static string mySearchList;
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
// 标准参数传递
myPage = int.Parse(Request.QueryString["Page"]);
mySearchList = Request.QueryString["SearchList"];
mySearchKeyword = Request.QueryString["SearchKeyword"];
}
} --------------------编程问答-------------------- 不用静态! --------------------编程问答-------------------- 两个用户的不能保持各自的状态是什么意思?两个用户互不影响啊!哪里会有冲突呢? --------------------编程问答--------------------
当A用户搜索: "广州"的同时, B用户搜索: "深圳", 结果是A用户的搜索也变成了深圳 --------------------编程问答--------------------
如果不用静态, 如何让
// 分页参数
public static int myPage;
public static string mySearchKeyword;
public static string mySearchList;
在整个类中, 都可以调用呢? 因为还有其他的函数, 需要使用该参数.
--------------------编程问答-------------------- 不要用静态,用实例,用静态是公用,用实例才是王道。 --------------------编程问答--------------------
老兄, 有没有详细一点的代码说明呢? 弄个代码参考下吧. --------------------编程问答-------------------- [ThreadStatic]
public static int myPage;
public static string mySearchKeyword;
public static string mySearchList;
表示这几个变量是线程持有的
而不是所有线程共有的
这样每个线程都会拥有独有的,静态的myPage,mySearchKeyword和mySearchList --------------------编程问答--------------------
测试了, 但是结果还是一样的, 没有变化哦, 能帮忙再分析一下原因吗? --------------------编程问答--------------------
不会吧,我一直是这样用的啊,等我测试下楼主的代码 --------------------编程问答-------------------- 楼主是不是在同一台电脑上测试的啊
如果是同一台电脑就会出现问题 --------------------编程问答--------------------
不是在同一台电脑 , 是分别在两台电脑上测试的. --------------------编程问答--------------------
我大概分析了一下
可能是下面原因造成的:
多个用户请求的是同一个page实例,所以即便声明ThreadStatic也会认为是这个page实例的静态属性
1.page对象相同-->2.所有赋值均在同一个page对象进行-->3.page对象占用的线程不变-->4.page对象改变自己线程内的static属性
解决方法:
采用缓存技术缓存用户请求,例如:
public static Dictionary<string, object[]> cache;
protected void Page_Load(object sender, EventArgs e)
{
string cacheKey = string.Format("user:{0}",userid);
if (!cache.ContainsKey(cacheKey))
{
cache.Add(cacheKey,"用户搜索关键字");
}
}
--------------------编程问答-------------------- 上面楼主自己改造下应该就可以解决问题了 --------------------编程问答-------------------- 谢谢哦, 挺复杂的, 得研究研究. --------------------编程问答-------------------- 将绑定放入page.IsPostBack中
且记你的公共变量,不能赋session等全局值!!!!
--------------------编程问答--------------------
这样行不通啊,原始的代码就是这样的啊。 --------------------编程问答-------------------- 呵呵,楼主还没有搞定啊 --------------------编程问答-------------------- 不要用静态,用实例
补充:.NET技术 , ASP.NET