0

鉴于您只能在标记为 async 的方法中使用await关键字,那么从构造函数初始化基于文件的数据模型的方法是什么?还是打算在 OnNavigatedTo() 方法中设置 DataContext。

以前,我会简单地说

MyDataModel d = new MyDataModel();

MyDataModel 的构造函数将执行文件 I/O。

到目前为止,我所能想到的只是我可以在构造函数中使用 DispatchTimer 来触发一个标记为异步的事件处理程序并从那里执行文件 I/O。

4

3 回答 3

0

您可以将 DataModel 作为 Navigate 方法中的参数传递,然后从 e.Parameter 将其转换回 OnNavigatedTo(NavigationEventArgs e)。

-或者-

您可以尝试使用 IOC 容器,我使用过Ninject,但不确定它是否适用于 Metro 应用程序。 MVVM Light也有一个简单的 IOC 容器。

于 2012-05-31T18:32:15.727 回答
0

如果我正确理解了您的问题(基于您对迈克尔回答的评论)。您很难await在构造函数中进行异步操作。构造函数不能是异步的,因此您不能在那里等待任何异步方法。但是,有一个简单的解决方法;您可以重构构造函数中的所有异步操作并将它们添加到异步方法中,但无需等待它。在下面的示例中,您可以LoadFileAsync从构造函数中调用。

class MyDataModel
{
  public MyDataModel()
  {
      LoadFileAsync(); 
  }
  public async void LoadFileAsync()
  {
     // do async operations here 
     var file = await FooAsync(); 
  }
}

这样做最终将允许您从页面的构造函数或从onNavigateTo

于 2012-06-01T00:10:23.770 回答
0

我发现的底线是,基本上不可能在对象构造函数中使用“明显同步”行为进行文件 I/O。

因此,在我的 Win8 应用程序中,我可以选择在导航到第一页之前实例化数据模型(如果这涉及文件 I/O,这并不是一个好主意),或者只是忍受“松散的糊涂”视觉体验,这样我的第一个页面出现,然后,在加载数据并使用实际数据模型更新 DataContext 后,数据在准备好时“飞入”。

鉴于应用程序应该在 < 5 秒内启动(如果可能的话,远远少于该时间),我选择了“松散笨拙”的方法。

于 2012-06-04T19:45:44.557 回答