【问题标题】:How to process time consuming serverside initialization in MVC?如何在 MVC 中处理耗时的服务器端初始化?
【发布时间】:2013-02-05 20:56:52
【问题描述】:

我目前开始了一个小项目,体验 JS 和 HTML5 的世界。

几个月前我已经尝试过了,但我停止了,因为我没有足够的时间从头开始创建 MVC 单页应用程序。有太多的概念和模式,必须理解,如果我在日常工作中缺乏使用,我会后悔失去所有这些知识。 使用它或失去它!

昨天我刚刚在 John Papa 的博客上找到了 this post,我认为这将是一个很好的开始。基本上,它是一个名为 HotTowel 的 MVC 模板,它实现了数据绑定、缩小等已经很不错的概念。我会在我目前需要的范围内体验代码,并会在需要时进一步体验它。

我想构建一个应用程序,用于从我现有的数据模型项目中获取数据。在我们的 Silverlight 应用程序中,我们通过预加载和初始化字典和其他属性并调用 async Init() 方法来引导它(例如,用于下载包含自定义代码的 XML 文件并将它们放入字典中)。 MEF 用于摆脱不方便的依赖关系。

据我了解,服务器端初始化必须在 Global.asax 文件中的 Application_Start() 方法中完成。我想知道如何在这种方法中等待异步调用?最佳做法是什么?我在客户端的查询在很大程度上依赖于这些类的初始化。有哪些选择?

我的想法如下:

  • Application_Start() 触发并忘记异步初始化过程。如果我在初始化完成之前执行一个请求(我猜是在控制器上),我必须等待初始化过程的回调并在它到达时立即开始查询。这样做的好处是,初始化运行,而用户已经可以浏览应用程序。
  • 我会实现某种惰性初始化。一旦提出第一个请求,我就会处理初始化。不过,第一个请求可能需要很长时间。
  • 我会在Application_Start() 中同步运行初始化过程。到目前为止,我看到的主要缺点是浏览器窗口对用户来说似乎是冻结的。如果可以让用户跟踪当前的初始化状态(某种闪屏),我会对这个解决方案感到满意。

虽然我不知道它们中的任何一个会如何具体工作,但如果你们中的任何人能给我一些关于如何以及从哪里开始的建议,我会很高兴。

【问题讨论】:

    标签: c# asp.net-mvc server-side single-page-application hottowel


    【解决方案1】:

    您可以使用Task<MyDataModel> 来表示数据。

    static Task<MyDataModel> dataTask;
    public static Task<MyDataModel> LoadDataModelAsync()
    {
      var ret = new MyDataModel();
      await ret.Init();
      return ret;
    }
    

    Application_Start(或静态构造函数)中启动它:

    dataTask = LoadDataModelAsync();
    

    然后您需要它的每个操作都可以await 完成:

    MyDataModel data = await dataTask;
    ...
    

    如果已经完成,await 将检测到并继续(同步)。

    【讨论】:

      猜你喜欢
      • 2023-03-18
      • 2020-07-29
      • 2011-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-23
      • 2014-05-24
      相关资源
      最近更新 更多