46 votes

Besoin d'un long processus ASP.NET MVC avec les commentaires des utilisateurs

J'ai essayé de créer un contrôleur dans mon projet pour la fourniture de ce que pourrait être assez de rapports complexes. Ainsi, ils peuvent prendre un temps relativement long et une barre de progression serait certainement aider les utilisateurs à savoir que les choses avancent. Le rapport sera lancé via une requête AJAX, avec l'idée étant de périodique JSON demandes du statut et de mettre à jour la barre de progression.

J'ai fait des expériences avec la AsyncController comme cela semble être un bon moyen de faire tourner des longs processus sans monopoliser les ressources, mais il ne semble pas me donner un moyen de vérifier sur les progrès (et semble bloquer d'autres JSON demandes et je n'ai pas découvert pourquoi encore). Après que j'ai essayé de recourir au stockage de progrès dans une variable statique sur le contrôleur et la lecture de l'état de celle - mais pour être honnête, que tout semble un peu hacky!

Toutes les suggestions bienvenues!

52voto

Darin Dimitrov Points 528142

Voici un exemple que j'ai écrit que vous pourriez essayer:

Contrôleur:

public class HomeController : AsyncController
{
    public ActionResult Index()
    {
        return View();
    }

    public void SomeTaskAsync(int id)
    {
        AsyncManager.OutstandingOperations.Increment();
        Task.Factory.StartNew(taskId =>
        {
            for (int i = 0; i < 100; i++)
            {
                Thread.Sleep(200);
                HttpContext.Application["task" + taskId] = i;
            }
            var result = "result";
            AsyncManager.OutstandingOperations.Decrement();
            AsyncManager.Parameters["result"] = result;
            return result;
        }, id);
    }

    public ActionResult SomeTaskCompleted(string result)
    {
        return Content(result, "text/plain");
    }

    public ActionResult SomeTaskProgress(int id)
    {
        return Json(new
        {
            Progress = HttpContext.Application["task" + id]
        }, JsonRequestBehavior.AllowGet);
    }
}

Vue:

<script type="text/javascript">
$(function () {
    var taskId = 543;
    $.get('/home/sometask', { id: taskId }, function (result) {
        window.clearInterval(intervalId);
        $('#result').html(result);
    });

    var intervalId = window.setInterval(function () {
        $.getJSON('/home/sometaskprogress', { id: taskId }, function (json) {
            $('#progress').html(json.Progress + '%');
        });
    }, 5000);
});
</script>

<div id="progress"></div>
<div id="result"></div>

L'idée est de commencer une opération asynchrone qui fera rapport sur les progrès réalisés à l'aide HttpContext.Application ce qui signifie que chaque tâche doit avoir un id unique. Puis sur le côté client, nous avons commencer la tâche, puis d'envoyer plusieurs requêtes AJAX (toutes les 5s) pour mettre à jour l'état d'avancement. Vous pouvez ajuster les paramètres pour ajuster à votre scénario. La poursuite de l'amélioration serait d'ajouter la gestion des exceptions.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X