【问题标题】:Threading using AJAX使用 AJAX 进行线程处理
【发布时间】:2009-09-03 15:23:19
【问题描述】:

当用户单击链接以生成报告时,我会进行 AJAX 调用,该调用会在后台生成 pdf 文件。现在文件很大,运行时高达 10mb 或更多。因此需要一些时间。同时用户应该能够导航其他链接,就好像什么都没发生一样。所以我需要以这样一种方式实现,即 pdf 生成过程开始并且用户不必等待该过程完成。这可能吗?我正在使用AJAX Pro with c# with dot net framework 2.0

这里的问题是,一旦 AJAX 活动开始,浏览器就会进入挂起阶段,用户必须等待,尽管他点击了不同的链接。

【问题讨论】:

    标签: c# javascript ajax multithreading


    【解决方案1】:

    我可能会为用户创建一个“队列”或“收件箱”......

    使用 ThreadPool.QueueUserWorkItem 开始您的 pdf 生成例程(您还需要修改生成方法以输出到他们的收件箱)

    然后在每个 http 请求中检查收件箱并通知用户该项目...您始终可以按时间间隔或某事轮询服务器

    【讨论】:

      【解决方案2】:

      当然,但是一旦用户导航到另一个页面,等待 Ajax 响应的 Javascript 将不再运行,因此该请求会丢失。您必须找到一种方法来保持该页面打开(使用框架或专门的 Ajaxified 导航),或者找到一种方法来存储响应并在下一个页面视图中通知用户其完成。例如,存储一个指示操作已完成的会话变量,或者将其存储在具有(可能)一个“未读”布尔值的数据库中。

      【讨论】:

      • True 。但我的问题是浏览器进入挂起阶段,用户最终必须等待。我想分离它。而且响应对我没有用。
      • 啊,在那种情况下你需要一个工作线程。看看下面 ObeseCoder 的回答,它会导致 ASP.NET 运行时产生一个单独的线程来执行操作,并让主线程返回而不等待它完成。
      【解决方案3】:

      您可以使用异步 Ajax 调用来执行其他任务,同时响应对象从 Ajax 页面返回。 下面是一些例子,testAjax.aspx 是这里的 Ajax 页面:

      http_request.onreadystatechange = function() { alertContents(http_request); };
      http_request.open('GET', 'testAjax.aspx?', true);
      http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
      http_request.send(null);
      
      function alertContents(http_request)
      {//debugger;
          if (http_request.readyState == 4)
          {
              if (http_request.status == 200)
              {
                  var vResult;
                  vResult=http_request.responseText;    
                  //Write your logic after successful Ajax call here.                
              }
              else
              {
                  alert('There was a problem with the request.');
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2020-02-04
        • 2019-04-23
        • 1970-01-01
        • 2019-02-27
        • 2018-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多