当前位置:编程学习 > C#/ASP.NET >>

多用户同时搜索时, 搜索的参数如何维持各个用户的搜索状态呢?

前情提要: 一个客户资料管理系统, 所有的客户资料共享, 任意查阅

问题描述: 当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"];
    }
} --------------------编程问答-------------------- 不用静态! --------------------编程问答-------------------- 两个用户的不能保持各自的状态是什么意思?两个用户互不影响啊!哪里会有冲突呢? --------------------编程问答--------------------
引用 2 楼 rocky_wl 的回复:
两个用户的不能保持各自的状态是什么意思?两个用户互不影响啊!哪里会有冲突呢?


当A用户搜索: "广州"的同时, B用户搜索: "深圳", 结果是A用户的搜索也变成了深圳 --------------------编程问答--------------------
引用 1 楼 maddemon 的回复:
不用静态!


如果不用静态, 如何让
// 分页参数 
    public static int myPage; 
    public static string mySearchKeyword; 
    public static string mySearchList; 

在整个类中, 都可以调用呢? 因为还有其他的函数, 需要使用该参数.
--------------------编程问答-------------------- 不要用静态,用实例,用静态是公用,用实例才是王道。 --------------------编程问答--------------------
引用 5 楼 sxlfybb 的回复:
不要用静态,用实例,用静态是公用,用实例才是王道。


老兄, 有没有详细一点的代码说明呢? 弄个代码参考下吧. --------------------编程问答-------------------- [ThreadStatic]
public static int myPage; 
public static string mySearchKeyword; 
public static string mySearchList; 

表示这几个变量是线程持有的
而不是所有线程共有的

这样每个线程都会拥有独有的,静态的myPage,mySearchKeyword和mySearchList --------------------编程问答--------------------
引用 7 楼 brz97 的回复:
[ThreadStatic] 
public static int myPage; 
public static string mySearchKeyword; 
public static string mySearchList; 

表示这几个变量是线程持有的 
而不是所有线程共有的 

这样每个线程都会拥有独有的,静态的myPage,mySearchKeyword和mySearchList


测试了, 但是结果还是一样的, 没有变化哦, 能帮忙再分析一下原因吗? --------------------编程问答--------------------
引用 8 楼 xin20080520 的回复:
引用 7 楼 brz97 的回复:
[ThreadStatic] 
public static int myPage; 
public static string mySearchKeyword; 
public static string mySearchList; 

表示这几个变量是线程持有的 
而不是所有线程共有的 

这样每个线程都会拥有独有的,静态的myPage,mySearchKeyword和mySearchList 
 

测试了, 但是结果还是一样的, 没有变化哦, 能帮忙再分析一下原因吗?


不会吧,我一直是这样用的啊,等我测试下楼主的代码 --------------------编程问答-------------------- 楼主是不是在同一台电脑上测试的啊
如果是同一台电脑就会出现问题 --------------------编程问答--------------------
引用 10 楼 brz97 的回复:
楼主是不是在同一台电脑上测试的啊 
如果是同一台电脑就会出现问题


不是在同一台电脑 , 是分别在两台电脑上测试的. --------------------编程问答--------------------
引用 11 楼 xin20080520 的回复:
引用 10 楼 brz97 的回复:
楼主是不是在同一台电脑上测试的啊 
如果是同一台电脑就会出现问题 
 

不是在同一台电脑 , 是分别在两台电脑上测试的.


我大概分析了一下
可能是下面原因造成的:

多个用户请求的是同一个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等全局值!!!!
--------------------编程问答--------------------
引用 15 楼 sa123789 的回复:
将绑定放入page.IsPostBack中 
且记你的公共变量,不能赋session等全局值!!!! 


这样行不通啊,原始的代码就是这样的啊。 --------------------编程问答-------------------- 呵呵,楼主还没有搞定啊 --------------------编程问答-------------------- 不要用静态,用实例
补充:.NET技术 ,  ASP.NET
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,