我有以下情况: 我正在调用我的控制器索引函数,控制器为了生成它传递给视图的模型必须调用一些Web服务来获取这里的数据是代码(没有实名):
public ActionResult Index()
{
var viewModel = new SomeViewModel();
viewModel.SomeData1=wcfProxy.Function1();
viewModel.SomeData2=wcfProxy.Function2();
viewModel.SomeData3=wcfProxy.Function3();
return View(viewModel);
}
我的问题是花了很长时间没有并行获取页面内容看看这个屏幕截图:
你可以看到它花了14.5秒才开始与同时连接并行加载脚本。 这真烦人!如何减少加载时间?
答案 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的调用都将一个接一个地运行。