Windows Phone: как узнать, когда Deployment.Current.Dispatcher.BeginInvoke завершен? - PullRequest
3 голосов
/ 26 февраля 2012

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

Код потока, в основном, обрабатывает некоторые данные и добавляет элементы в наблюдаемую коллекцию; чтобы избежать проблем с исключениями, я выполняю что-то вроде:

Deployment.Current.Dispatcher.BeginInvoke(() => { _events.Add(_newItem); });

, чтобы добавить элемент в коллекцию в потоке пользовательского интерфейса.

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

Из прочитанного мною чтения похоже, что одним из подходов будет вызов EndInvoke (), чтобы заблокировать фоновый поток, пока часть пользовательского интерфейса не будет завершена. К сожалению, похоже, что реализация Wp7 / Silverlight не поддерживает EndInvoke.

Любые предложения о том, как я могу проверить, что добавление было завершено, прежде чем я начну foreach?

Спасибо.

Philip

1 Ответ

14 голосов
/ 26 февраля 2012

Это очень просто;)

// must be executed in background
foreach (Item item in Items)
{
    EventWaitHandle Wait = new AutoResetEvent(false);
    Deployment.Current.Dispatcher.BeginInvoke(() =>
    {
        _events.Add(_newItem);
        Wait.Set();
    });
    // wait while item is added on UI
    Wait.WaitOne();
}
// here all items are added

Этот подход вы можете использовать везде, где вам нужно синхронизировать фон и выполнение потока пользовательского интерфейса

...