Проблема с производительностью при асинхронной первой загрузке TabItem - PullRequest
0 голосов
/ 19 сентября 2011

У меня проблема с производительностью в приложении, когда я загружаю TabItem (каждый TabItem привязан к ViewModel, каждый ViewModel имеет DataTemplate).Чтобы решить эту проблему, я использую асинхронную загрузку в конструкторе ViewModel:

public MyViewModel(MyObject entity)
    {
       // WpfContext it's my Dispatcher
       Task.Factory.StartNew(() => WpfContext.Invoke(() =>
                                   {
                                       //Initialisation
                                       LoadMyObject(entity);
                                   }));
    }

В этом решении при первой загрузке TabItem требуется несколько раз, и он выглядит не совсем асинхронным.Для других нагрузок это работает хорошо и асинхронно.Я не знаю точно, почему.Любое предложение?

1 Ответ

1 голос
/ 19 сентября 2011

Invoke в Dispatcher - это блокирующий вызов как для фонового потока вашей Задачи, так и для потока пользовательского интерфейса (как только он решит фактически выполнить ваш код).

Иногда это кажется асинхронным, потому что поток пользовательского интерфейса показывает новую вкладку, и поэтому Invoke из фонового потока блокируется, пока поток пользовательского интерфейса не успеет обработать его. Когда кажется, что это синхронно, вызов Invoke обрабатывается потоком пользовательского интерфейса до , когда отображается новая вкладка. Итак, в конце концов, я думаю, что у вас есть состояние гонки.

Чтобы решить эту проблему, вам может потребоваться рефакторинг метода LoadMyObject, чтобы его можно было запускать в фоновом потоке, или вы можете использовать метод Dispatcher.BeginInvoke и предоставить ему более низкий приоритет, чтобы обеспечить отображение новой вкладки предшествует обработке LoadMyObject вызова

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...