我目前开始了一个小项目,展现了JS和HTML5的世界。
几个月前我已经试过了,但是我停了下来,因为我没有足够的时间从头开始创建一个MVC单页面应用程序。有太多的概念和模式,必须被理解,我会后悔失去所有的知识,因为我的日常工作缺乏使用。 使用它或丢失它!昨天我刚刚在John Papa的博客上发现了this post,我觉得这可以作为一个开始使用。基本上它是一个名为 HotTowel 的MVC模板,它实现了数据绑定,缩小等已经很好的概念。我会尽我所能地体验代码,并且会在我需要的时候进一步体验。
我想构建一个从我的工作现有数据模型项目中获取数据的应用程序。在我们的Silverlight应用程序中,我们通过预加载和初始化字典和其他属性并调用异步 Init()
方法来引导它(例如,用于下载包含自定义代码的XML文件并将它们放入字典中)。 MEF用于摆脱不方便的依赖。
据我所知,服务器端初始化必须在Global.asax文件的Application_Start()
方法中完成。我想知道如何在这种方法中等待异步调用?什么是最佳做法?我在客户端的查询很大程度上依赖于这些类进行初始化。有什么选择?
我的想法如下:
Application_Start()
触发并忘记异步初始化过程。如果我在初始化完成之前执行了一个请求(我想在控制器上),我必须等待初始化过程的回调并在它到达时立即启动查询。这样做的好处是,初始化运行,而用户已经可以浏览应用程序。Application_Start()
中同步运行初始化过程。到目前为止我看到的主要缺点是浏览器窗口似乎冻结给用户。如果可以让用户跟踪当前的初始化状态(某种启动画面),我会对这个解决方案感到满意。虽然我不知道他们中的任何一个会如何巧妙地工作,但如果你们中的任何人能够就如何以及从何处开始给我一些建议会很高兴。
答案 0 :(得分:4)
您可以使用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
将检测到并继续(同步)。