1

我有一个 ASP.NET WebMethod 的 JQuery AJAX 调用。

我理解async: true这允许网页在函数返回之前不会被锁定,因此我将其设置为'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;
    }
}
4

2 回答 2

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/

编写代码时要考虑的一件事是,您的应用程序是否将在负载平衡环境中提供服务。如果是这样,您可能需要配置“粘性会话”或确保可以从每个 Web 服务器访问唯一的作业标识符密钥及其关联的作业。享受!

于 2013-06-11T17:32:39.470 回答
0

这只会发生在开发 Web 服务器中,不会发生在生产环境中的 IIS 中。

ASP.NET 开发服务器并发处理不起作用

于 2013-06-11T17:52:27.557 回答