是否可以使用Thread或Task一次加载多个局部视图?

时间:2013-12-30 07:38:04

标签: c# asp.net-mvc-3

我在一个视图页面上有4个部分视图,每个视图页面只显示一个记录列表。是否可以使用线程或任务一次加载所有部分视图?

1 个答案:

答案 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次操作的加载时间的总和,但它将是最慢的。