问题是这样的,我们这里要做一个数据库测试,要用到CACHE功能,而且还要并发进行,也就是说,要这样完成,首先,要同时生成十个THREAD,然后它们都去调一个方法,这个方法从数据库里多次查询出一些相同信息,但是...,第一次查询时候要把结果集DATASET放进CACHE里,也就是说,多个线程调用同一个CACHE里的内容,只有当里面没有的时候才查询一次,以后都直接从CACHE里取就可以,但是我怎么做都实现不了,请问,这种东西可实现吗,请解释,谢谢,一下是我的部分代码...调用那个方法在不用THREAD的时候是好使的,就是只有第一次查询了,之后都从CACHE里取的,但是多THREAD一调用就不好使了,愁啊...,谁知道啊,请帮助一下啊...
msn:[email protected]
    protected void Button2_Click(object sender, EventArgs e)
    {
        ............
    
        sqlCnn = new SqlConnection(strCnn);
        sqlCnn.Open();
        for (int i = 0; i < 10; i++)
        {
            Thread th = new Thread(new ThreadStart(byThread));
            th.Start();        }
    } private void byThread()
    {
        ......数据库连接建立...        sqlCnn = new SqlConnection(strCnn);
        sqlCnn.Open();
        long beginTime = DateTime.Now.Ticks;
        DataSet ds = null;        HttpContext context = HttpContext.Current;
        if (context != null)
        {
            ch = context.Cache;
        }
        else
        {
            ch = HttpRuntime.Cache;
        }        for (int i = 0; i < 1000; i++)
        {
            if (null != ch["dsAll"])
            {
                ds = (DataSet)ch["dsAll"];
                //DataRow[] temRow = ds.Tables["images"].Select();
            }
            else
            {
                ds = new DataSet();
                SqlCommand cmm = new SqlCommand();
                cmm.Connection = sqlCnn;
                cmm.CommandText = "select ImageBody from images";
                SqlDataAdapter adp = new SqlDataAdapter();
                adp.SelectCommand = cmm;
                adp.Fill(ds, "images");                Cache.Insert("dsAll", ds,
                    new SqlCacheDependency("ImageDB", "images"));
            }
        }
        long endTime = DateTime.Now.Ticks;
        this.allTime = allTime + (endTime - beginTime);
        TextBox1.Text = allTime.ToString();
        Thread.Sleep(0);
    }

解决方案 »

  1.   

    是不是“未引用对象到实例”啊想不通你为什么要放多线程在循环里面,这个稳定性很难控制的。
    双线程就得了。Thread thread1 = new Thread(new ThreadStart(getpage));
    thread1.Name = "myTopWin01";
    thread1.Start();
    thread1.Join();
    if (!thread1.IsAlive)//如果线程不是未正常终止或中止
    {
    Thread.Sleep(1);//阻塞指定的1毫秒 
    }
      

  2.   

    else
                {
    Monter.Enter(ch);
    if(null == ch["dsAll"])){
                    ds = new DataSet();
                    SqlCommand cmm = new SqlCommand();
                    cmm.Connection = sqlCnn;
                    cmm.CommandText = "select ImageBody from images";
                    SqlDataAdapter adp = new SqlDataAdapter();
                    adp.SelectCommand = cmm;
                    adp.Fill(ds, "images");                Cache.Insert("dsAll", ds,
                        new SqlCacheDependency("ImageDB", "images"));}
    Monter.Exit(ch);
                }大致就是上面的代码意思,在插入之前进行同步,避免重复插入。
      

  3.   

    帮你顶一下,估计是httpcontext.current的问题
      

  4.   

    把你的httpcontext.current.cache改成httpruntime.cache
      

  5.   

    这个问题不难吧你Lock住取DataSet到Cache的那个方法就可以了,那是不可重入的方法呀
      

  6.   

    sqlCnn = new SqlConnection(strCnn);
    sqlCnn.Open();
    在这一步中间怀疑是不是会拖死ODBC??
    DateSet添充应该放到外面..
    然后操作每一条记录的时候把当前线程加一个锁.防止其它线程同时访问当前的记录