【问题标题】:JQuery AJAX call to WebMethod multi threadedJQuery AJAX 调用 WebMethod 多线程
【发布时间】:2013-06-11 17:09:55
【问题描述】:

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

我理解async: true 允许网页在函数返回之前不会被锁定,因此我将其设置为'true'

我面临的问题是GetVersion()内部的内部方法GetVersionFromDataBase()需要很长时间才能完成,同时整个后端被锁定(单线程)。

用户体验是,对于正在浏览网站的其他用户,即使在不同的页面上,他们的屏幕也会被锁定,直到 'heavy' 方法返回。

如何使函数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;
    }
}

【问题讨论】:

  • 当您说“整个后端被锁定(单线程)”时,您的意思是这发生在IIS的生产环境中吗?或者这只是发生在您的开发 Web 服务器中?每个请求都应该由 IIS 异步处理。
  • Rob,它发生在我的开发 Web 服务器上。我在调用该方法并且整个网站挂起时打开了一个新选项卡。您认为它在生产 IIS 上的作用会有所不同吗?
  • 根据我的经验,它只发生在开发服务器中。看到这个帖子:stackoverflow.com/questions/9036150/…
  • 我在下面添加了一个答案,如果你觉得是正确的答案,请标记它。

标签: jquery asp.net ajax


【解决方案1】:

编辑:@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 服务器访问唯一的作业标识符密钥及其关联的作业。尽情享受吧!

【讨论】:

    【解决方案2】:

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

    ASP.NET Development Server concurrent processing doesn't work

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-07
      • 2014-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多