2013-10-06 23 views
1

我在metro应用程序中使用MVVMLight框架。我开始通过在我的ViewModel构造函数中加载数据,并且一切正常。在构建结束时,我在app.xaml中引入了一些额外的异常处理。mvvmlight windows 8 metro异步加载数据在viewmodel构造函数中

TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException; 

这开始引发了很多关于任务未正确等待的错误。

我将ViewModel构造函数的数据加载调用移动到我的页面LoadState方法中,并等待他们在那里,一切正常。不过,我已经读过这可能是不好的做法。

我应该以某种方式向ViewModel构造函数引入异步调用吗?感兴趣的最佳实践可能是什么?也许我应该删除异常处理程序!

类似的问题已经在这里问: MVVM view model and async data initialisation

+0

我有几个博客文章[在构造函数中执行'async'工作](http://blog.stephencleary.com/2013/01/async-oop-2-constructors.html )和['async' properties](http://blog.stephencleary.com/2013/01/async-oop-3-properties.html),您可能会发现有帮助。 –

回答

1

不知道在哪里看到LoadState中的数据调用加载是一种不好的做法,在大多数情况下,您甚至无法在加载状态之前加载数据,因为您需要通过LoadState传递的任何参数。甚至参数也是不需要的我个人更喜欢在LoadState中加载数据,因为开始在构造函数中加载数据意味着在加载页面的时候你会花费一些CPU时间,所以它会花费更长的时间加载。我看到在构造函数中加载它的唯一原因是数据在设计时加载(因为视图模型的构造函数将被调用,但不是LoadState),但为此您可以添加一个条件(ViewModelBase.IsInDesignModeStatic)来调用load在构造函数的设计时间

+0

我认为你是对的,我不记得我在LoadState中加载数据的地方是不好的练习。我使用MVVM Light框架,并在示例代码/模板中将数据加载到构造函数中。也许是因为这让我问了这个问题。 – user1706388

0

首先,一对夫妇的规则:

  1. 确保所有Tasks正在等待
  2. 不要写async void除了事件处理程序。

这照顾了,检查你是否仍然有一些错误。你可能已经有了一些错误,但他们并没有浮出水面。