在执行批量数据更新及插入操作的同时,同一浏览器打不开另一个aspx页面,只有等批量操作完成才能打开? 本帖最后由 jasonpeng2 于 2013-06-29 12:03:15 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 测试过修改为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;} 程序界面:点击按钮处,通过ajax运行ashx,执行批量数据处理: 程序界面:点击按钮后,通过ajax运行ashx,执行批量数据处理,需要比较长的时间:在执行批量数据处理的同时,无法打开其他的aspx页面:批量数据处理运行完成,才能打开其他的aspx页面: 怀疑是SQLSERVER导致的,因为A页面不停的插入数据,导致数据库把A表锁定了,B页面访问A表需要等待,你先测试一个不访问数据库的页面,试试能不能打开,如果能打开就应该是A表锁定导致的,那就好办了,在B页面访问数据的时候写成select * from a with(readpast) 或者select * from a with(nolock) 试试 数据更新时更新a表,但是要新开的aspx页面,访问的目标页面不管是使用a表,还是其他表的数据,都是打不开的。只有等批量处理完成才能正常访问。 另外,我又测试了,执行数据更新时,打开另一个纯aspx页面,新开的这个页面没有数据库,也是打不开的。。 就算用来测试的新开的aspx页面,只在前台aspx页面放了一些文本内容,并且未使用服务器控件,后台cs也没有写代码。。同样要等数据更新完成了,才能打得开。 那你做个测试看看写个A.ASPX在load里面写Thread.Sleep(30000),然后访问A.aspx再访问其他页面看看能不能打开 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); 阻塞了,找找asp.net异步编程方面的资料吧比如这个http://blog.csdn.net/zztfj/article/details/6837985 更正一下,上面b.ashx使用Thread.Sleep(30000),刚开始打不开其他页面,不知道是不是因为缓存的问题,我清空了,重新测试,现在可以打开新的aspx页面,测试了有使用数据库和不使用数据库的情况,都可以打开。 相反的,先清空了一下缓存。。再次测试一下。。如果执行b.ashx中批量数据操作。。新开的aspx,不管有没有访问数据库,都要等待b.ashx执行完成后,才能打开。 代码都是在本机运行的。截图的ip就是本机在局域网中的ip。 程序中有母版页,母版页没有读取数据库。。根据母版页创建的页面有读取数据库。。这种页面打不开测试过新开的aspx页面,不管有没有访问数据库,就算不是根据母版页来创建的,只要在批量处理数据时。。这些页面都打不开。。 如果是数据库阻塞的话,按理说,新开的aspx页面,不访问数据库的页面应该可以打开,但是这种也打不开。。 代码太多,懒得看了。如果你通过测试,明确知道与数据库无关,与服务器阻塞响应有关,那么顶多你可以在b.ashx中提前执行一个 context.Response.close()之类的语句(这并不影响你的服务器端程序继续对数据库处理),较早地结束浏览器端请求。要知道你只是在写一个简单的瘦we应用程序。如果想写出专业的企业web应用程序,建议使用silverlight,而不是Asp.net! 批量执行数据更新时,使用了using的方式打开数据连接,这种方式在操作完成后,会自动关闭连接的。 如果确定不是数据库问题的话,这种诡异的问题,建议楼主还是换一个机器试试吧。看看是不是iis或者系统什么的有问题。 ashx文件改用委托异步调用方式执行批量数据处理时,也是打不开新的aspx页面。。运行批量数据处理,在另一个浏览器上就可以比如我使用ie8,如果在执行数据处理时,在新选项卡中打不开新的页面,但是在新窗口中,也就是新开一个ie,就可以打开。。换成firefox的话,执行数据处理时,无论是新窗口还是新选项卡,都打不开新页面。 既然你重复说明这个,所谓“委托异步调用方式”跟我说的 context.Response.close() 完全两码事。我看到你在上面早就说过了。 你所谓的“委托异步xxxxx”之类的,还不是拖着浏览器端不结束?你应该尽量早地写 context.Response.close()。不用再去纠结数据库操作、委托异步之类的。那些都不至于让你的页面死掉而同时打开另外一种浏览器又可以。 研究了很久,自己找到答案了,没一个对的。。原来是session阻塞了。。 Excel中如何合并单元格?谁有更好的方法 TabPanel默认选择 内存溢出 DataGrid行选中,页面闪烁的问题 用Javascript真的没有办法知道当前窗口是否处于激活状态? 请教如何在webconfig里面设置邮件服务器? 如何做webgis ,吐血求助!!! 高手请进!关于生成HTML文件的编码问题,困扰我了两周了?????????? .net真的不行吗?????!!??!? 知道DATAGRID的列名,如何得到该列? c#窗体程序与c++控制台程序通信! 求助,请问类似这种操作导航似的页面用ASP.NET能实现吗
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;
}
点击按钮处,通过ajax运行ashx,执行批量数据处理:
点击按钮后,通过ajax运行ashx,执行批量数据处理,需要比较长的时间:
在执行批量数据处理的同时,无法打开其他的aspx页面:
批量数据处理运行完成,才能打开其他的aspx页面:
你先测试一个不访问数据库的页面,试试能不能打开,
如果能打开就应该是A表锁定导致的,那就好办了,在B页面访问数据的时候
写成select * from a with(readpast)
或者select * from a with(nolock) 试试
写个A.ASPX
在load里面写Thread.Sleep(30000),
然后访问A.aspx再访问其他页面看看能不能打开
{
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);
比如这个
http://blog.csdn.net/zztfj/article/details/6837985
如果执行b.ashx中批量数据操作。。新开的aspx,不管有没有访问数据库,都要等待b.ashx执行完成后,才能打开。
测试过新开的aspx页面,不管有没有访问数据库,就算不是根据母版页来创建的,只要在批量处理数据时。。这些页面都打不开。。
看看是不是iis或者系统什么的有问题。
运行批量数据处理,在另一个浏览器上就可以
比如我使用ie8,如果在执行数据处理时,在新选项卡中打不开新的页面,但是在新窗口中,也就是新开一个ie,就可以打开。。
换成firefox的话,执行数据处理时,无论是新窗口还是新选项卡,都打不开新页面。
既然你重复说明这个,所谓“委托异步调用方式”跟我说的 context.Response.close() 完全两码事。我看到你在上面早就说过了。