JQuery AJAX调用WebMethod多线程

时间:2013-06-11 17:09:55

标签: jquery asp.net ajax

我有一个针对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;
    }
}

2 个答案:

答案 0 :(得分:0)

编辑:@Rob是对的,一个用户启动的长时间运行过程(即使你正在这样做)也不应该真正影响其他用户,除非它真的占用了你所有的CPU周期和内存。在这种情况下,我的方法无助于解决这个问题。

有很多方法可以解决这个问题(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