Как работать с 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, это может быть хорошей идеей, но на практике эти вещи должны быть проверены отмечен (и, возможно, под большой нагрузкой), чтобы убедиться, что вы получаете ожидаемую выгоду. Имейте в виду, что код вашего сервера будет более сложным (и сложным в обслуживании), если вы сделаете его асинхронным. Я бы посоветовал вам пойти по этому пути, только если вы получите значительную выгоду.

Другие вопросы по тегам