Как работать с AsyncController в asp.net MVC 3? - PullRequest
3 голосов
/ 08 ноября 2011

Поиск по нескольким блогам об этом, но всегда одни и те же примеры.

Я не знаю, неправильно или не знаю, но не вижу параллельного процесса при работе с 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 Ответ

3 голосов
/ 08 ноября 2011

Я думаю, вы неправильно понимаете, что делает асинхронный фоновый работник.

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

В вашем случае, я думаю, вам следует создать очень простое представлениеон быстро возвращается к пользователю и запускает длительную операцию в виде асинхронного запроса от клиента .Например, визуализируйте быстрые части вашей страницы (например, заголовок, меню и т. Д.) И сделайте AJAX-запрос для записей в блоге.

В зависимости от характера кода в GetEntriesBlog вам может не потребоватьсяработа контроллера асинхронная.Теоретически, поскольку большую часть времени в этом методе будет тратиться на ожидание завершения HTTP-запроса GET на http://blog.bindsolution.com/rss, это может быть хорошей идеей, но на практике эти вещи должны бытьСкамья отмечена (и, возможно, под большой нагрузкой), чтобы убедиться, что вы получаете ожидаемую выгоду.Имейте в виду, что код вашего сервера будет более сложным (и сложным в обслуживании), если вы сделаете его асинхронным.Я бы посоветовал вам пойти по этому пути, только если вы получите значительную выгоду.

...