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読み込みメッセージの長いライムの後、最後のメッセージのみが表示されます

また、ブラウザコンソールでは、長い時間が経つと最初のリクエストが完了し、その後2番目のリクエストが完了することがわかります。しかし、あるべきgetProgressですか?

jquery.docを確認したところ、$postはasynchronousリクエストであると表示されています。

コードやロジックの何が問題になっているのか、誰か説明してもらえますか?

4

2 に答える 2

3

あなたはここで議論されている状況にいます:

ASP.net セッション要求のキューイング

特定のユーザーのセッションに対する要求が処理されている間、同じセッションに対する他の要求が待機しています。長い関数をバックグラウンド スレッドで実行し、それを開始する要求を終了させる必要があります。ただし、バックグラウンド スレッドはセッションにアクセスできないため、進行状況を伝える別のメカニズムが必要になります。

于 2012-12-06T17:04:15.363 に答える
1

あなたが提供した情報から、同期しているのはJavaScriptコードではなく、サーバー側のコードであると思われます。これは、Firebug または Chrome の開発ツールを使用して 2 つの AJAX リクエストの開始時刻と終了時刻を確認することでテストできます。私が正しければ、2 番目の要求は 0.5 秒後に開始されますが、最初の要求が完了するまで完了しません。

その場合、次の原因が考えられます。

  • Visual Studio の開発環境、特にデバッグ モードで実行すると、非同期性の量が減少するようです。開発環境は、一度に 1 つの要求を処理するのが好きなようです。
  • セッション リクエストのキューイングに関するIgor の回答を参照してください。
  • リソースを明示的にロックし、実行時間の長いリクエストが完了するまで 2 番目のリクエストをブロックするコードがある場合があります。

もう 1 つの考えられる原因は、ほとんどのブラウザーが特定のドメインへの限られた数の同時要求しか許可しないという事実です。特定の時点で保留中のリクエストがいくつかある場合、ブラウザは残りのリクエストが返されるまでキューに入れている可能性があります。

于 2012-12-06T17:02:34.097 に答える