Индикатор выполнения MVC3 Async jQuery в запросе на вставку

Итак, я пытаюсь добавить асинхронный индикатор выполнения к очень медленному и длинному запросу, который вставляет кучу строк в базу данных. Моя реализация основана на этом примере: http://blog.janjonas.net/2012-01-02/asp_net-mvc_3-async-jquery-progress-indicator-long-running-tasks

Вот код javascript для индикатора выполнения

function updateMonitor(taskId, status) {
        $("#" + taskId).html("Task [" + taskId + "]: " + status);
    }
//other code
if (doSend == true) {
            $.post("/SendBatch/HandleBatchRequest", {
                //other code
            },
            function (taskId) {

                // Init monitors
                //breakpoint here does not stop it, it never enters this somehow?
                $("#monitors").append($("<p id='" + taskId + "'/>"));
                updateMonitor(taskId, "Started");

                // Periodically update monitors
                var intervalId = setInterval(function () {
                    $.post("SendBatch/Progress", { id: taskId }, function (progress) {
                    if (progress >= 100) {
                        updateMonitor(taskId, "Completed");
                        clearInterval(intervalId);
                    } else {
                        updateMonitor(taskId, progress + "%");
                    }
                });
            }, 100);
        }       
        ,"html");

Затем в отображаемой части веб-сайта есть DIV.

<div id="monitors"></div>

Вот так выглядит контроллер

public SendBatchController
    //some code
private static IDictionary<Guid, int> tasks = new Dictionary<Guid, int>();

public ActionResult HandleBatchRequest(
        //some code
    )
    {
        var taskId = Guid.NewGuid();
        tasks.Add(taskId, 0);



        var batchId = Guid.NewGuid().ToString("N");
        var costd = cost.ToDecimal();

        IEnumerable<BatchListModel> customers;

        try
        {
            customers = new CustomerService(_customerRepository.Session).GetCustomers(
                //some code
                );
        }
        catch (Exception err)
        {
            return Json(err.Message);
        }
        if (doSend)
        {
            var sent = 0;

            foreach (var c in customers)
            {
                try
                {
                    var usr = _customerRepository.LoadByID(c.ID);

                    var message = new ComLog
                                      {
                                          //insertions to log
                                      };

                    _comLogRepository.Save(message);
                    sent++;

                    //progress bar part inside here that is important comes here:
                    tasks[taskId] = sent;

                }
                catch (Exception e)
                {
                    Log.WriteLine("ERR:" + e);
                }

                tasks.Remove(taskId);

            }
            return Json(taskId);

        }

        return Json(customers.Count() + " customers");
    }

    public ActionResult Progress(Guid id)
    {
        return Json(tasks.Keys.Contains(id) ? tasks[id] : 100);
    }

Это не работает. Процесс работает в фоновом режиме. Только div никогда не появляется и никогда не дает никаких указаний. Я знаю, что это много кода для чтения, но я действительно застрял и хотел бы узнать, как это исправить.


person Totty    schedule 21.02.2013    source источник
comment
Я все еще не могу заставить это работать. Div не дает никакой информации во время запроса, но когда запрос завершен, он дает подтверждение того, что он завершен. Я думаю, проблема заключается в том, что $.post(/SendBatch/HandleBatchRequest, {//другой код} должен быть выполнен до того, как он попадет в скобку function (taskId) {. С точкой останова внутри функции (taskId) это подтверждает мою теорию, но я не знаю, как это исправить Я даже не уверен, понимаю ли я, как/если этот метод знает общее количество запросов, которые будут выполнены, поэтому не могу показать процент выполнения.   -  person Totty    schedule 22.02.2013


Ответы (1)


попробуйте изменить свою функцию updateMonitor на это:

function updateMonitor(taskId, status) {
    $("#monitors").html("Task [" + taskId + "]: " + status);
}
person andri    schedule 21.02.2013
comment
Спасибо! Теперь я вижу div и его задачу [7575d90d-12e2-4cbc-9263-61b7e4e222bc]: запущено. Это еще не совсем работает, но я должен быть в состоянии исправить это в свое время. - person Totty; 21.02.2013