2013-10-06 4 views
1

Я использую среду MVVMLight в приложении метро. Я начал с загрузки данных в мои конструкторы ViewModel, и все сработало нормально. К концу сборки я ввел некоторые дополнительные обработки исключений в app.xaml.mvvmlight windows 8 metro данные загрузки async в конструкторе 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, потому что при загрузке его в конструкторе означает, что вы собираетесь взять некоторое время процессора во время загрузки страницы, поэтому он займет страницу немного дольше нагрузки. Единственная причина, по которой я могу загрузить его в конструкторе, - это то, что данные загружаются во время разработки (потому что будет отображаться модель вида cosntructor, но не LoadState), но для этого вы можете просто добавить условие (ViewModelBase.IsInDesignModeStatic) для вызова нагрузки в конструкторе для времени разработки

+0

Я думаю, что вы правы, и я не могу вспомнить, где я увидел, что загрузка данных в LoadState была плохой практикой. Я использую среду MVVM Light, а в примере кода/шаблонов он загружает данные в конструкторе. Возможно, именно это заставило меня задать вопрос. – user1706388

0

Во-первых, несколько правил:

  1. Убедитесь, что все Tasks ожидаются
  2. Никогда не записывайте async void для обработчиков событий, за исключением.

Это позаботится, проверьте, есть ли у вас еще некоторые ошибки. Скорее всего, у вас уже были некоторые ошибки, но они не всплыли.

Смежные вопросы