Как работать с AsyncController в asp.net MVC 3?
Ищите несколько блогов об этом, но всегда одни и те же примеры.
Я не знаю, если неправильно понял или не знаю использования, но не вижу параллельного процесса при работе с AsyncController.
Выполнены следующие тесты
Создайте новый проект типа Asp.net MVC
HomeController.cs
public void IndexAsync()
{
AsyncManager.OutstandingOperations.Increment();
var bg = new BackgroundWorker();
bg.DoWork += (o, e) => GetEntriesBlog();
bg.RunWorkerCompleted += (o, e) =>
{
AsyncManager.Parameters["items"] = e.Result;
AsyncManager.OutstandingOperations.Decrement();
};
bg.RunWorkerAsync();
ViewBag.Message = "Modify this template to kick-start your ASP.NET MVC application.";
}
public ActionResult IndexCompleted(IEnumerable<SyndicationItem> items)
{
return View(items);
}
[NonAction]
public IEnumerable<SyndicationItem> GetEntriesBlog(int page = 0)
{
using (var reader = XmlReader.Create("http://blog.bindsolution.com/rss"))
{
Thread.Sleep(20000);
var rssData = SyndicationFeed.Load(reader);
if (rssData != null)
{
return (from item in rssData.Items
orderby item.PublishDate descending
select item).Take(3).Skip(3 * page).ToList();
}
return null;
}
}
Всегда задерживайте 20 секунд просмотра сайта!
Я думал об использовании PartialView AsyncController для выполнения этой задачи. Работа?
1 ответ
Я думаю, что вы неправильно понимаете, что будет делать асинхронный фоновый работник.
Если операция занимает 20 секунд, использование фонового работника не сократит это время и не сделает отображение более быстрым. Использование асинхронных операций освободит рабочий процесс на сервере для обработки других запросов, в то время как этот длительный запрос продолжает обрабатываться.
В вашем случае, я думаю, вам следует создать очень простое представление, которое быстро возвращается пользователю и запускает длительную операцию как асинхронный запрос от клиента. Например, визуализируйте быстрые части вашей страницы (например, заголовок, меню и т. Д.) И сделайте AJAX-запрос для записей в блоге.
В зависимости от характера кода в GetEntriesBlog вам может не потребоваться сделать работу контроллера асинхронной. Теоретически, поскольку большую часть времени в этом методе будет тратиться на ожидание завершения HTTP-запроса GET на http://blog.bindsolution.com/rss, это может быть хорошей идеей, но на практике эти вещи должны быть проверены отмечен (и, возможно, под большой нагрузкой), чтобы убедиться, что вы получаете ожидаемую выгоду. Имейте в виду, что код вашего сервера будет более сложным (и сложным в обслуживании), если вы сделаете его асинхронным. Я бы посоветовал вам пойти по этому пути, только если вы получите значительную выгоду.