MVC4慢加载我该怎么办?

时间:2014-01-26 10:45:21

标签: c# asp.net-mvc-4 optimization

我有以下情况: 我正在调用我的控制器索引函数,控制器为了生成它传递给视图的模型必须调用一些Web服务来获取这里的数据是代码(没有实名):

 public ActionResult Index()
    {

       var viewModel = new SomeViewModel();

       viewModel.SomeData1=wcfProxy.Function1();
       viewModel.SomeData2=wcfProxy.Function2();
       viewModel.SomeData3=wcfProxy.Function3();

        return View(viewModel);
    }

我的问题是花了很长时间没有并行获取页面内容看看这个屏幕截图:

slowLoading

你可以看到它花了14.5秒才开始与同时连接并行加载脚本。 这真烦人!如何减少加载时间?

3 个答案:

答案 0 :(得分:2)

我们不知道。到目前为止,您还没有向我们展示任何代码,只有一些泛型方法调用。你要么必须optimize the WCF methods所以他们不需要15s(最好的解决方案,因为15s真的很荒谬),或者至少使你的逻辑parallel/async(例如使用ajax)。

这是c#和.NET4中并行编程的一个很好的链接 http://blogs.msdn.com/b/csharpfaq/archive/2010/06/01/parallel-programming-in-net-framework-4-getting-started.aspx

主要思想是开始加载数据而不等待先前的方法调用。目前你的函数function2和function3等待前面的函数完成。如果你并行调用它们,最后的时间会更短。这就像用水桶倒空管子。更多水桶同时取水,过程越快。

通过Web开发,您也可以使用ajax。基本思路是在没有这些数据的情况下将页面发送到客户端,等待页面加载,然后使用ajax异步加载内容(不要忘记通知客户端数据仍在加载)。

例如jQuery非常适用于此:http://api.jquery.com/jquery.ajax/

答案 1 :(得分:2)

最好的选择可能只是在没有数据的情况下返回视图,然后使用ajax调用获取页面以加载'慢'数据异步。

所以你的控制器看起来像这样:

public ActionResult Index()
{

    var viewModel = new SomeViewModel();

    return View(viewModel);
}

public ActionResult DataOne()
{
   var data =wcfProxy.Function1();
   return JSON(data,, JsonRequestBehavior.AllowGet);
}
...

然后,您应该能够使用javascript来检索和显示数据。以下示例使用JQUery库。

$.get("/ControllerName/DataOne").done( function (data) {
       //display data.
});

JQuery文档,可以找到JQuery Docs,非常有用并且有很多例子。

答案 2 :(得分:1)

您写道:

  

没有并行获取页面内容

你不应该只是让你的代码平行吗?例如。通过使用支持TPL的async / await关键字?否则,每次对WCF的调用都将一个接一个地运行。