Асинхронизация в MVC - PullRequest
       34

Асинхронизация в MVC

0 голосов
/ 19 апреля 2009

У меня есть этот веб-сервис, который всасывает данные об обменных курсах, моя проблема с ним заключается в том, что загрузка занимает много времени. Поэтому я хочу загрузить данные асинхронно, но когда я вызываю метод GetRatesASync (), он говорит:

"В этом контексте недопустимы асинхронные операции. Страница, запускающая асинхронную операцию, должна иметь для атрибута Async значение true, и асинхронная операция может быть запущена только на странице до события PreRenderComplete."

Да, кстати, я использую сервис мыла и MVC UserControl, если это вообще помогает, и я поместил метод GetRatesASync () в защищенное переопределение void OnPreRender (EventArgs e). Итак, как мне получить эти кровавые данные ASync с помощью jquery после загрузки страницы. И есть ли способ ускорить получение данных

Ответы [ 3 ]

2 голосов
/ 19 апреля 2009

Если вы хотите асинхронизировать в MVC, вы можете использовать AsyncController, включенный в ASP.NET MVC Futures .

Но асинхронная операция не сделает ваш веб-сервис быстрее ... он только предотвратит блокировку вашего потока.

1 голос
/ 21 апреля 2009

Используя jquery, как насчет: 1) дождаться загрузки страницы в браузере; 2) вызвать функцию JavaScript, которая выполняет асинхронный вызов на сервер; 3) дождаться результата; 4) когда результат поступит с сервера, отобразить его в браузере?

Что-то вроде:

Javascript / jquery на веб-странице:

$().ready(GetExchangeRates);
function GetExchangeRates()
{
    // TODO: Maybe show a *loading* animation.
    $.get("/Currency/GetExchangeRates",
        null, GetExchangeRatesCompleted, "json");
}
function GetExchangeRatesCompleted(result)
{
    // TODO: Hide *loading* animation.
    // TODO: Display result on page.
}

Действие контроллера (C #):

public class CurrencyController : Controller
{
    public JsonResult GetExchangeRates()
    {
        var exchangeRates = _slowWebService.GetExchangeRates();
        return Json(exchangeRates);
    }
}

Другое дело:

Если вы не можете кэшировать обменные курсы, как насчет сохранения их в XML-файле в папке App_Data с записью, в которой указано, когда в последний раз были получены обменные курсы из медленного веб-сервиса, а затем при обновлении этого XML-файла он старше определенного интервала времени?

0 голосов
/ 10 декабря 2012

вот более простой код без AsyncController, но с использованием задачи TPL

 public async Task<ActionResult> Index() 
    {
      var exchangeRates = await _slowWebService.GetExchangeRates(); // this method should return Task<IEnumerable<ExchangeRate>>
        return Json(exchangeRates);

    return View(result);
    }

проверить это видео Методы действия задачи mvc4 и tpl

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...