我在取消异步回发时遇到了一些麻烦。我有一个更新面板,其中包含一个取消按钮,以便用户可以取消回发。当用户单击按钮以生成报告时,将显示更新进度。该报告可能需要一些时间,因为它必须循环一千次左右才能创建一个Excel电子表格。如果用户因任何原因决定取消运行报告,则可以单击取消按钮,然后在javascript中调用abortPostBack(),这将停止更新进度并再次显示该页面。但是,用户无法执行任何其他操作,例如导航到另一个页面,因为服务器仍在处理循环。当用户点击取消按钮时,如何停止服务器处理的循环?任何帮助表示赞赏!
答案 0 :(得分:1)
您是说在异步回发完成之前,客户端无法访问简单的HTTP链接?如果是这样,这听起来像一个难题,因为您要么必须优化服务器端进程,要么设置较小的服务器端请求超时。要么重新设计用户交互,要么使服务器端Excel生成过程成为异步,而不是同步,这样用户就不必等到Excel生成完成。你可以在客户端看上去然后设置一个JavaScript计时器来定期查询服务器以查看文件是否准备就绪,如果是,请向用户表明并给他们一个下载文件链接选项,或者其他什么。
否则,如果您可以在等待返回时调用另一个AJAX请求(您可能听不到它),您可以简单地执行一个“取消”长时间运行进程的新HTTP请求。但这似乎不起作用,因为服务器仍在处理长时间运行的HTTP请求。所以我选择调查我的第一段中的选项。
如果取消确实允许在客户端执行异步HTTP请求,则可以设置会话状态值以指示已请求取消。就个人而言,我不会这样做。但是如果你这样做了,那么你长期运行的服务器端进程可能会定期查找是否存在会话值。说:
if (Session["cancel-me"] != null)
{
Session["cancel-me"] = null;
abortThisLongProcess();
}
答案 1 :(得分:0)
是的,即使您使用浏览器后退按钮离开页面,只要您单击需要回发到服务器的任何其他内容,页面就会挂起,直到漫长的过程完成。看起来没有办法取消所以我将不得不重新设计Excel代。
答案 2 :(得分:0)
我还没有找到取消正在运行的请求的方法,但没有真正的理由让你无法启动新的请求。
默认情况下,ASP.Net尝试(不能总是)对会话对象应用独占锁 - 只要一个页面读取每个传递相同会话ID的页面请求(通过cookie或URL) )必须等待第一页释放会话。
客户端取消了请求并不重要 - 服务器将继续锁定会话,直到原始页面完成执行。
我认为解决方案是do away with the ASP session entirely。然后,当用户请求另一个页面时,它立即开始,即使服务器仍在另一个线程上处理旧请求。