1

我有一个执行时间很长的函数。

 public void updateCampaign()
    {

        context.Session[processId] = "0|Fetching Lead360 Campaign";
        Lead360 objLead360 = new Lead360();
        string campaignXML = objLead360.getCampaigns();

        string todayDate = DateTime.Now.ToString("dd-MMMM-yyyy");
        context.Session[processId] = "1|Creating File  for Lead360 Campaign on " + todayDate;
        string fileName = HttpContext.Current.Server.MapPath("campaigns") + todayDate + ".xml";
        objLead360.createFile(fileName, campaignXML);

        context.Session[processId] = "2|Reading The latest Lead360 Campaign";
        string file = File.ReadAllText(fileName);

        context.Session[processId] = "3|Updating Lead360 Campaign";
        string updateStatus = objLead360.updateCampaign(fileName);
        string[] statusArr = updateStatus.Split('|');
        context.Session[processId] = "99|" + statusArr[0] + " New Inserted , " + statusArr[1] + " Updated , With " + statusArr[2] + " Error , ";
    }

所以为了跟踪函数的进度,我写了另一个函数

public void getProgress()
    {
        if (context.Session[processId] == null)
        {
            string json = "{\"error\":true}";
            Response.Write(json);
            Response.End();
        }else{
            string[] status = context.Session[processId].ToString().Split('|');
            if (status[0] == "99") context.Session.Remove(processId);

            string json = "{\"error\":false,\"statuscode\":" + status[0] + ",\"statusmsz\":\"" + status[1] + "\" }";
            Response.Write(json);
            Response.End();  
        }
    }

使用 jQuery post 请求来调用它

reqUrl = "AjaxPages/lead360Campaign.aspx?processid=" + progressID + "&action=updatecampaign";
$.post(reqUrl);
setTimeout(getProgress, 500);

获取 getProgress 是:

function getProgress() {
    reqUrl = "AjaxPages/lead360Campaign.aspx?processid=" + progressID + "&action=getProgress";
    $.post(reqUrl, function (response) {
        var progress = jQuery.parseJSON(response);
        console.log(progress)
        if (progress.error) {
            $("#fetchedCampaign .waitingMsz").html("Some error occured. Please try again later.");
            $("#fetchedCampaign .waitingMsz").css({ "background": "url(common/images/ajax_error.jpg) no-repeat center 6px" });
            return;
        }
        if (progress.statuscode == 99) {
            $("#fetchedCampaign .waitingMsz").html("Update Status :"+ progress.statusmsz );
            $("#fetchedCampaign .waitingMsz").css({ "background": "url(common/images/ajax_loded.jpg) no-repeat center 6px" });
            return;
        }
        $("#fetchedCampaign .waitingMsz").html("Please Wait... " + progress.statusmsz);
        setTimeout(getProgress, 500);
    });
}

但问题是我看不到中间消息。在很长一段时间的 ajax 加载消息之后,只显示最后一条消息

同样在浏览器控制台上,我只是看到在很长一段时间后第一个请求完成,然后第二个请求完成。但应该有getProgress吗?

我检查了 jquery.doc,它说 $post 是一个asynchronous请求。

谁能解释一下代码或逻辑有什么问题?

4

2 回答 2

3

您处于此处讨论的情况:

ASP.net 会话请求队列

在处理给定用户会话的请求时,同一会话的其他请求正在等待。您需要在后台线程中运行长函数并让启动它的请求完成。但是,后台线程将无法访问会话,您将需要不同的机制来传达其进度。

于 2012-12-06T17:04:15.363 回答
1

根据您提供的信息,我怀疑不是您的 javascript 代码正在同步,而是服务器端代码。您可以使用 Firebug 或 Chrome 的开发工具来测试这两个 AJAX 请求的开始和结束时间。如果我是对的,您会看到第二个请求在半秒后开始,但直到第一个请求之后才完成。

如果是这种情况,可能的原因是:

  • 在 Visual Studio 的开发环境中运行,尤其是在调试模式下,似乎可以减少异步性。开发环境似乎喜欢一次处理一个请求。
  • 请参阅Igor关于会话请求队列的回答。
  • 您的代码可能会显式锁定资源并导致第二个请求阻塞,直到长时间运行的请求完成。

另一个可能的罪魁祸首是大多数浏览器只允许对特定域的有限数量的并发请求。如果您在任何给定时刻有几个请求待处理,则浏览器可能只是将剩余的请求排队,直到它们返回。

于 2012-12-06T17:02:34.097 回答