鉴于您只能在标记为 async 的方法中使用await关键字,那么从构造函数初始化基于文件的数据模型的方法是什么?还是打算在 OnNavigatedTo() 方法中设置 DataContext。
以前,我会简单地说
MyDataModel d = new MyDataModel();
MyDataModel 的构造函数将执行文件 I/O。
到目前为止,我所能想到的只是我可以在构造函数中使用 DispatchTimer 来触发一个标记为异步的事件处理程序并从那里执行文件 I/O。
鉴于您只能在标记为 async 的方法中使用await关键字,那么从构造函数初始化基于文件的数据模型的方法是什么?还是打算在 OnNavigatedTo() 方法中设置 DataContext。
以前,我会简单地说
MyDataModel d = new MyDataModel();
MyDataModel 的构造函数将执行文件 I/O。
到目前为止,我所能想到的只是我可以在构造函数中使用 DispatchTimer 来触发一个标记为异步的事件处理程序并从那里执行文件 I/O。
您可以将 DataModel 作为 Navigate 方法中的参数传递,然后从 e.Parameter 将其转换回 OnNavigatedTo(NavigationEventArgs e)。
-或者-
您可以尝试使用 IOC 容器,我使用过Ninject,但不确定它是否适用于 Metro 应用程序。 MVVM Light也有一个简单的 IOC 容器。
如果我正确理解了您的问题(基于您对迈克尔回答的评论)。您很难await
在构造函数中进行异步操作。构造函数不能是异步的,因此您不能在那里等待任何异步方法。但是,有一个简单的解决方法;您可以重构构造函数中的所有异步操作并将它们添加到异步方法中,但无需等待它。在下面的示例中,您可以LoadFileAsync
从构造函数中调用。
class MyDataModel
{
public MyDataModel()
{
LoadFileAsync();
}
public async void LoadFileAsync()
{
// do async operations here
var file = await FooAsync();
}
}
这样做最终将允许您从页面的构造函数或从onNavigateTo
我发现的底线是,基本上不可能在对象构造函数中使用“明显同步”行为进行文件 I/O。
因此,在我的 Win8 应用程序中,我可以选择在导航到第一页之前实例化数据模型(如果这涉及文件 I/O,这并不是一个好主意),或者只是忍受“松散的糊涂”视觉体验,这样我的第一个页面出现,然后,在加载数据并使用实际数据模型更新 DataContext 后,数据在准备好时“飞入”。
鉴于应用程序应该在 < 5 秒内启动(如果可能的话,远远少于该时间),我选择了“松散笨拙”的方法。