我在一个视图页面上有4个部分视图,每个视图页面只显示一个记录列表。是否可以使用线程或任务一次加载所有部分视图?
答案 0 :(得分:0)
您宁愿使用AJAX调用来并行加载这些部分。这将允许您快速加载初始页面,然后触发并行AJAX调用以填充部分。在执行这些AJAX调用期间,用户不会冻结浏览器,并且仍然可以使用页面的其余部分。
在服务器上使用线程或任务没有多大意义,因为它们不会带来任何好处。现在要说的是,也可以在服务器上进行一些优化。假设绑定到这些部分的数据是独立的。这意味着它可以从相应的数据源并行获取,而不必等待其他数据。因此,基本上要考虑具有每个部分的复杂属性的视图模型。现在,您可以使用asynchronous controller
并行加载此视图模型的每个属性。
所以不要使用以下控制器操作:
public class HomeController: Controller
{
public ActionResult Index()
{
MyViewModel model = new MyViewModel();
model.Foo = GetFooFromDbSynchronously();
model.Bar = GetBarFromDbSynchronously();
model.Baz = GetBazFromDbSynchronously();
return View(model);
}
}
你会得到这个:
public class HomeController: AsyncController
{
public void IndexAsync()
{
AsyncManager.OutstandingOperations.Increment(3);
BeginGetFooFromDbAsynchronously(foo =>
{
AsyncManager.Parameters["foo"] = foo;
AsyncManager.OutstandingOperations.Decrement(1);
});
BeginGetBarFromDbAsynchronously(bar =>
{
AsyncManager.Parameters["bar"] = bar;
AsyncManager.OutstandingOperations.Decrement(1);
});
BeginGetBazFromDbAsynchronously(baz =>
{
AsyncManager.Parameters["baz"] = baz;
AsyncManager.OutstandingOperations.Decrement(1);
});
}
public ActionResult IndexCompleted(Foo foo, Bar bar, Baz baz)
{
MyViewModel model = new MyViewModel();
model.Foo = foo;
model.Bar = bar;
model.Baz = baz;
return View(model);
}
}
视图当然是相同的,采用主视图模型并渲染每个属性的部分。这里的好处是每个部分的信息独立于其他部分被检索,这将加快页面加载时间。因此,总页面加载时间不会是3次操作的加载时间的总和,但它将是最慢的。