1

Нужно создавать VM в отдельном потоке. Пробовал два варианта:

  1. Этот вариант тормозит главный поток

        public class MainVm : VmBase
    
        {
            public ButtonsVm ButtonsVm { get; private set; }
    
    
            public MainVm()
            {
                Init();
            }
    
            private async void Init()
            {
                var uiContext = TaskScheduler.FromCurrentSynchronizationContext();
    
                ButtonsVm = await
                    Task.Factory.StartNew(() => new ButtonsVm(), CancellationToken.None,
                        TaskCreationOptions.None, uiContext);
            }
        }
    
  2. С этим вылетает exception

        public class MainVm : VmBase
    
        {
            public ButtonsVm ButtonsVm { get; private set; }
    
    
            public MainVm()
            {
                Init();
            }
    
            private async void Init()
            {
                await Task.Run(() => ButtonsVm = new ButtonsVm());
            }
        }
    

Additional information: Must create DependencySource on same Thread as the DependencyObject.

UPDATE: ButtonsVm в себе содержит еще около 15 VM, и обращается к модели которая работает с Entity, поэтому и хочется вынести ее создание в отдельный поток чтобы первое подключение к базе не подтормаживало программу.

Lightness
  • 3,476

1 Answers1

1

Вы должны создавать VM в главном потоке. А вот модельные объекты должны создаваться асинхронно, в отдельном потоке. И работа с ними тоже должна вестить асинхронно.

Ваша проблема не на этом уровне.

VladD
  • 206,799
  • VladD, вижу вы человек опытный в WPF, не могли бы подсказать хороший пример реализации сервиса создания дочерних и диалоговых окон в контексте паттерна MVVM? P.S. Могу создать отдельный вопрос под это дело ) – sp7 May 21 '16 at 11:03
  • @sp7: Где-то был вопрос на эту тему, сейчас поищу... – VladD May 21 '16 at 11:06
  • @sp7: Вот для немодальных окон: http://ru.stackoverflow.com/q/455715/10105 (но там привязка VM к окну выполняется вручную). – VladD May 21 '16 at 11:08
  • VladD, хотелось что-то вроде myWindowsSrv.ShowWindow(childVM); т.е. вызвал сервис создания окон, передал ему VM и сервис на основе этой VM отобразил нужную View. – sp7 May 21 '16 at 11:14
  • @sp7: Это ж классический Dependency Injection :) Напишите вопрос, да. – VladD May 21 '16 at 11:29
  • @sp7, и киньте сюда ссылку на вопрос, мне тоже интересно :) – Lightness May 21 '16 at 11:30
  • VladD, ссылка на вопрос http://ru.stackoverflow.com/questions/525998/%d0%a1%d0%b5%d1%80%d0%b2%d0%b8%d1%81-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d1%8f-%d0%bc%d0%be%d0%b4%d0%b0%d0%bb%d1%8c%d0%bd%d1%8b%d1%85-%d0%b8-%d0%bd%d0%b5%d0%bc%d0%be%d0%b4%d0%b0%d0%bb%d1%8c%d0%bd%d1%8b%d1%85-%d0%be%d0%ba%d0%be%d0%bd-%d0%b2-%d0%ba%d0%be%d0%bd%d1%82%d0%b5%d0%ba%d1%81%d1%82%d0%b5-%d0%bf%d0%b0%d1%82%d1%82%d0%b5%d1%80%d0%bd%d0%b0-mvvm – sp7 May 21 '16 at 12:04
  • @Lightness: Написал ответ на вопрос о сервисе. – VladD May 21 '16 at 20:38