如何使用asp.net MVC 3中的AsyncController?

时间:2011-11-08 13:55:46

标签: asp.net-mvc-3 asynccontroller

搜索几个关于它的博客但总是相同的例子。

我不知道如果误解或者不知道使用,但在使用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 个答案:

答案 0 :(得分:3)

我认为你误解了异步后台工作者会做什么。

如果使用后台工作程序操作需要20秒,则不会缩短该时间或使视图渲染速度更快。使用异步操作将释放服务器上的工作进程以处理其他请求,同时这个长时间运行的请求会继续存在。

在您的情况下,我认为您应该创建一个非常简单的视图,该视图可以快速返回给用户并作为来自客户端的的异步请求从长时间运行的操作中获取。例如,渲染页面的快速部分(例如标题,菜单等)并为博客条目发出AJAX请求。

根据GetEntriesBlog中代码的性质,您可能不需要使控制器操作异步。从理论上讲,由于这种方法的大部分时间都花在等待HTTP http://blog.bindsolution.com/rss的HTTP GET请求上,它可能是一个好主意,但实际上这些事情需要是标记(并且可能在重负荷下)的工作台,以确保您获得您期望的好处。请记住,如果将其设置为异步,则服务器代码端将更复杂(并且更难维护)。我建议你只有在获得重大利益的情况下才能走这条路。