3

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

我不知道是否误解或不知道使用但在使用 AsyncController 时看不到并行进程。

进行了以下测试

创建一个 Asp.net MVC 类型的新项目

家庭控制器.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 来执行此任务。工作?

4

1 回答 1

3

我认为您误解了异步后台工作人员会做什么。

如果操作需要 20 秒,则使用后台工作人员不会减少该时间或使视图渲染更快。使用异步操作将释放服务器上的工作进程来处理其他请求,而这个长时间运行的请求会继续运行。

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

根据 GetEntriesBlog 中代码的性质,您可能不需要使控制器操作异步。理论上,由于此方法中的大部分时间都将花费在等待对http://blog.bindsolution.com/rss的 HTTP GET 请求完成,这可能是一个好主意,但实际上这些事情需要进行标记(并且可能在重负载下)以确保您获得预期的好处。请记住,如果您使其异步,您的服务器代码端将更加复杂(并且更难维护)。我建议您只有在获得显着收益时才走这条路。

于 2011-11-08T19:06:56.567 回答