Обновление окна из другого потока при выполнении других операций? - PullRequest
1 голос
/ 23 сентября 2011

Я пытался удержать заставку моего приложения от зависания, пока приложение загружает свои исходные данные, однако мне пока не удалось найти способ сделать это.

Вот код, который я пробовал:

SplashView splashScreen = new SplashView();
            new Thread((ThreadStart)delegate
            {
                splashScreen.Dispatcher.Invoke((Action)delegate
                {
                    while ((bool)splashScreen.Dispatcher.Invoke((Func<SplashView, bool>)delegate(SplashView sView) { return sView.IsEnabled; }, DispatcherPriority.Render, new object[] { splashScreen }))
                    {
                        splashScreen.Dispatcher.Invoke((Action<SplashView>)delegate(SplashView sView) { sView.UpdateLayout(); }, DispatcherPriority.Render, new object[] { splashScreen });
                        Thread.Sleep(10);
                    }
                }, DispatcherPriority.Render, new object[] { });
            }).Start();

Может кто-нибудь сказать, пожалуйста, как это сделать?

Спасибо, Алекс.

1 Ответ

2 голосов
/ 23 сентября 2011
  1. Загрузить все ваши данные (модели / модели просмотра) в фоновом потоке (например, BackgroundWorker).
  2. Dispatcher.Invoke() приведет к зависанию потока пользовательского интерфейса, поскольку несколько вызовов будут блокироваться из-за синхронного выполнения кода. Используйте Dispatcher.BeginInvoke() вместо этого. Он использует очередь диспетчера более эффективно.
  3. Используйте DispatcherPriority в ваших интересах. Любые уведомления от Splash UI, которые имеют меньшее значение, могут отображаться после более приоритетных.
  4. Используйте Dispatcher.PushFrames(), если хотите уведомить Splash о чем-то приоритетном.
  5. Разделите загрузку данных на несколько фоновых потоков и используйте Wait / Pulse, чтобы уведомить других о завершении медленных. Несвязанные данные могут быть загружены в разные потоки, например, Данные, относящиеся к финансам, и данные, относящиеся к сотрудникам, можно загружать с использованием разных потоков.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...