我有一个针对ASP.NET WebMethod的JQuery AJAX调用。
我理解async: true
允许在函数返回之前不会锁定WebPage,因此我将其设置为'true'
。
我面临的问题是GetVersionFromDataBase()
中的内部方法GetVersion()
需要很长时间才能完成,同时整个后端被锁定(单线程)。
用户体验是,对于正在浏览网站的其他用户,即使在不同的页面上,他们的屏幕也会被锁定,直到“重”方法返回。
如何让函数GetVersionFromDataBase()
处于不同的线程/任务中?
$.ajax({
type: "POST",
url: "Default.aspx/GetVersion",
contentType: "application/json; charset=utf-8",
dataType: "json",
async: true,
success: function (result) {
alert('the version is:' + result.d);
}
});
public partial class Default : System.Web.UI.Page
{
[WebMethod]
public string GetVersion()
{
string version = GetVersionFromDatabase(); // this is a heavy method freezes the program till it finishes
return version;
}
}
答案 0 :(得分:0)
有很多方法可以解决这个问题(ASP.NET长时间运行过程)。我一直使用服务器端后台线程与客户端轮询方法。这意味着您的应用程序将如下运行:
1)客户表示他们希望开始长时间运行的过程。
2)服务器在后台线程中启动进程,并向客户端返回唯一标识符。
3)客户等待一段时间,并询问服务器“我们还在吗?” (想想长途汽车后座的孩子)将这个问题传递给步骤2中的标识符,以便服务器知道要检查完成的工作。
4)服务器回复“尚未......”(返回步骤3)或“是的,我们在那里......”(转到步骤5)。
5)长时间运行的过程完成后,客户端很可能会从服务器请求一些结果并显示它们,或者只是向用户表明作业已完成。
现在 - 如何编码?这是我用了很多年的资源,它对我很有帮助,我对这些课程做了一些小改动,但整体方法很扎实:
http://www.devx.com/asp/Article/29617
这是另一个:
http://www.allannienhuis.com/archives/2010/11/27/long-running-asp-net-processes-a-simple-example/
编码时要考虑的一件事是,您的应用程序是否会在LOAD BALANCED环境中提供。如果是这样,您可能需要配置“粘性会话”或确保可以从每个Web服务器访问唯一作业标识符键及其关联作业。享受!
答案 1 :(得分:0)
这只会发生在开发Web服务器上,而不会发生在生产环境中的IIS中。
ASP.NET Development Server concurrent processing doesn't work