3

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

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

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

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

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

我的想法如下:

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

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

4

1 回答 1

4

您可以使用 aTask<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它将检测到并继续(同步)。

于 2013-02-20T18:31:33.327 回答