本帖最后由 jasonpeng2 于 2013-06-29 12:03:15 编辑

解决方案 »

  1.   

    测试过修改为Thread线程方式:
    b.ashx代码:// 定义公用变量
    public string msg = "";public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "text/plain";
        string strAction = context.Request["action"];
        int intDownTitle = 0;
        if (context.Request["downtitle"] != null)
        {
            int.TryParse(context.Request["downtitle"], out intDownTitle);
        }    if (strAction == "GetGoodsOnsale")
        {
            //context.Response.Write(GetGoodsOnsale(false, intDownTitle));
            ThreadStart starter = new ThreadStart(delegate
            {
                GetGoodsOnsale(false, intDownTitle);
            });
            Thread mythread = new Thread(starter);
            mythread.Start();
            while (msg == "")
            {
                Thread.Sleep(500);
            }
            context.Response.Write(msg);
        }
        部分代码省略……
    }protected void GetGoodsOnsale(bool IsIncrement, int intDownTitle)
    {
    其他不变,将return msg改为直接给公用变量msg赋值,代码省略……
        //return msg;
    }
      

  2.   

    程序界面:
    点击按钮处,通过ajax运行ashx,执行批量数据处理:
      

  3.   

    程序界面:
    点击按钮后,通过ajax运行ashx,执行批量数据处理,需要比较长的时间:
    在执行批量数据处理的同时,无法打开其他的aspx页面:
    批量数据处理运行完成,才能打开其他的aspx页面:
      

  4.   

    怀疑是SQLSERVER导致的,因为A页面不停的插入数据,导致数据库把A表锁定了,B页面访问A表需要等待,
    你先测试一个不访问数据库的页面,试试能不能打开,
    如果能打开就应该是A表锁定导致的,那就好办了,在B页面访问数据的时候
    写成select * from a with(readpast) 
    或者select * from a with(nolock)  试试
      

  5.   

    数据更新时更新a表,但是要新开的aspx页面,访问的目标页面不管是使用a表,还是其他表的数据,都是打不开的。只有等批量处理完成才能正常访问。
      

  6.   

    另外,我又测试了,执行数据更新时,打开另一个纯aspx页面,新开的这个页面没有数据库,也是打不开的。。
      

  7.   

    就算用来测试的新开的aspx页面,只在前台aspx页面放了一些文本内容,并且未使用服务器控件,后台cs也没有写代码。。同样要等数据更新完成了,才能打得开。
      

  8.   

    那你做个测试看看
    写个A.ASPX
    在load里面写Thread.Sleep(30000),
    然后访问A.aspx再访问其他页面看看能不能打开
      

  9.   

    b.ashx改为Thread.Sleep(30000)后,进行测试也是打不开其他页面。。内容修改如下:        public void ProcessRequest(HttpContext context)
            {
                context.Response.ContentType = "text/plain";
                string strAction = context.Request["action"];
                int intDownTitle = 0;            if (strAction == "GetGoodsInventory")
                {
                    //context.Response.Write(GetGoodsInventory(intDownTitle));
                    Thread.Sleep(30000);
                    context.Response.Write("返回结果");
                }
    点击按钮后,只执行Thread.Sleep(30000);
      

  10.   

    阻塞了,找找asp.net异步编程方面的资料吧
    比如这个
    http://blog.csdn.net/zztfj/article/details/6837985
      

  11.   

    更正一下,上面b.ashx使用Thread.Sleep(30000),刚开始打不开其他页面,不知道是不是因为缓存的问题,我清空了,重新测试,现在可以打开新的aspx页面,测试了有使用数据库和不使用数据库的情况,都可以打开。
      

  12.   

    相反的,先清空了一下缓存。。再次测试一下。。
    如果执行b.ashx中批量数据操作。。新开的aspx,不管有没有访问数据库,都要等待b.ashx执行完成后,才能打开。
      

  13.   

    代码都是在本机运行的。截图的ip就是本机在局域网中的ip。
      

  14.   

    程序中有母版页,母版页没有读取数据库。。根据母版页创建的页面有读取数据库。。这种页面打不开
    测试过新开的aspx页面,不管有没有访问数据库,就算不是根据母版页来创建的,只要在批量处理数据时。。这些页面都打不开。。
      

  15.   

    如果是数据库阻塞的话,按理说,新开的aspx页面,不访问数据库的页面应该可以打开,但是这种也打不开。。
      

  16.   

    代码太多,懒得看了。如果你通过测试,明确知道与数据库无关,与服务器阻塞响应有关,那么顶多你可以在b.ashx中提前执行一个 context.Response.close()之类的语句(这并不影响你的服务器端程序继续对数据库处理),较早地结束浏览器端请求。要知道你只是在写一个简单的瘦we应用程序。如果想写出专业的企业web应用程序,建议使用silverlight,而不是Asp.net!
      

  17.   

    批量执行数据更新时,使用了using的方式打开数据连接,这种方式在操作完成后,会自动关闭连接的。
      

  18.   

    如果确定不是数据库问题的话,这种诡异的问题,建议楼主还是换一个机器试试吧。
    看看是不是iis或者系统什么的有问题。
      

  19.   

    ashx文件改用委托异步调用方式执行批量数据处理时,也是打不开新的aspx页面。。
    运行批量数据处理,在另一个浏览器上就可以
    比如我使用ie8,如果在执行数据处理时,在新选项卡中打不开新的页面,但是在新窗口中,也就是新开一个ie,就可以打开。。
    换成firefox的话,执行数据处理时,无论是新窗口还是新选项卡,都打不开新页面。
      

  20.   


    既然你重复说明这个,所谓“委托异步调用方式”跟我说的 context.Response.close() 完全两码事。我看到你在上面早就说过了。
      

  21.   

    你所谓的“委托异步xxxxx”之类的,还不是拖着浏览器端不结束?你应该尽量早地写 context.Response.close()。不用再去纠结数据库操作、委托异步之类的。那些都不至于让你的页面死掉而同时打开另外一种浏览器又可以。
      

  22.   

    研究了很久,自己找到答案了,没一个对的。。原来是session阻塞了。。