Отображать прогресс при длительной работе? - PullRequest
1 голос
/ 26 декабря 2010

в моем проекте ASP.NET MVC3 у меня есть действие, которое выполняется определенное количество времени. Было бы неплохо, если бы он мог отправить частичные ответы обратно на просмотр. Цель состоит в том, чтобы показать пользователю некоторую информацию о прогрессе. Кто-нибудь знает, как заставить это работать?

Я попытался с прямым выводом ответа, но он отправляется клиенту не по частям, а по одному блоку:

[HttpPost]
public string DoTimeConsumingThings(int someId)
{
   for (int i = 0; i < 10; i++)
   {
      this.Response.Write(i.ToString());
      this.Response.Flush();
      Thread.Sleep(500); // Simulate time-consuming action
   }
   return "Done";
}

По виду:

@Ajax.ActionLink("TestLink", "Create", new AjaxOptions() 
  { HttpMethod = "POST", UpdateTargetId="ProgressTarget" })<br />

<div id="ProgressTarget"></div>

Кто-нибудь может помочь мне добиться прогрессивных результатов? Спасибо !!

1 Ответ

4 голосов
/ 27 декабря 2010

Вот как вы можете реализовать это: начните с определения некоторого класса, который будет содержать состояние длительной операции -> вам потребуются такие свойства, как id, progress, result, ... Затем вам понадобятся два действия контроллера : тот, который запустит задачу, и другой, который вернет прогресс. Действие Start создаст новый поток для выполнения длительной операции и немедленного возврата. После запуска задачи вы можете сохранить состояние этой операции в некотором общем хранилище, например, в приложении, используя идентификатор задачи.

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

Последняя часть - это клиент: вы можете опрашивать действие контроллера прогресса через регулярные промежутки времени, используя AJAX, и обновлять прогресс.

...