异步启动长时间运行的进程

时间:2013-11-13 22:04:39

标签: asp.net ajax web-services azure-webjobs

在我们的Web应用程序中,用户可以进行更改,这需要更新许多数据库表。所有这些的加载时间最长可达30秒。在导航到另一个页面之前,我不希望用户等待它完成。

我已将长时间运行的代码放在自己的页面上(例如,“updateinfo.aspx”)并尝试了一些解决方案,包括对“updateinfo.aspx”的jQuery AJAX调用或加载调用“updateinfo”的图像文件的.aspx”。在所有情况下,当执行“updateinfo.aspx”时,我无法从启动AJAX调用的原始HTML页面导航到另一个HTML页面。 Chrome表示“updateinfo.aspx”的请求正在等待处理。当我点击一个链接导航离开原始HTML页面时,我们“等待example.org ...”直到AJAX页面完成,然后导航到下一个HTML页面的请求将跟进并且新页面负荷。

因此,这违背了将长时间运行的代码放入AJAX页面的目的。用户的页面呈现速度很快,但是在AJAX页面完成之前,他们无法通过导航到另一页来继续他们的一天。我不关心AJAX页面的输出。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您不应该在网页上下文中真正执行长时间运行的进程;当客户端应用程序是Web浏览器时,HTTP请求/响应模型不利于该概念。这是我不得不多次解决的一个场景;你可以: -

  1. 使用MSMQ;向包含要执行的操作的详细信息的队列提交消息,或
  2. 将要执行的操作的详细信息写入“作业”表
  3. 然后,您可以创建一个Windows服务来从队列中读取消息/从表中一次拉出一个未处理的项目,并执行长时间运行的操作。

    在最近的项目中我必须这样做,从内存中,我创建了一个位于标题中的用户控件(即在母版页中),它每隔15秒通过jQuery Ajax轮询一次数据库表,以检测作业的时间完成后,向用户显示弹出窗口,表明作业已完成。

    我可以尝试在某个地方挖掘一些例子,但那些是主要的动作部分,这有帮助吗?