Когда моя MainPage загружается в мое приложение Windows Phone 7, оно вызывает всплывающий экран-заставку с индикатором выполнения и графикой в пользовательском контроле. После отображения экрана-заставки я выполняю некоторую работу в потоке BackgroundWorker, чтобы загрузить некоторые ресурсы, пока отображается экран-заставка. Когда загрузка завершена, я закрываю всплывающее окно. Этот метод хорошо документирован на WindowsPhoneGeek .
Сегодня я заметил, что хотя это работает безупречно при запуске в отладке в Visual Studio, если я запускаю ту же сборку напрямую, без отладчика, анимация заставки и индикатор выполнения никогда не появляются, а поток DoWork () занимает по крайней мере вдвое дольше, чтобы выполнить те же операции. Я вижу, что конструктор MainPage вызывается так же, как и OnNavigatedTo, но всплывающее окно по-прежнему не отображается, и изображение заставки jpg по умолчанию остается на экране, пока рабочий поток не завершится. Затем всплывающее окно отображается в течение <1 секунды, и отображается главная страница. Опять же, все это работает безупречно при отладке через VS 2010. </p>
Это все в эмуляторе, у меня еще нет устройства. Я только что заметил это сегодня, и по совпадению (?) Я только что обновил среду до 7.1 вчера вечером.
// Constructor
public MainPage()
{
InitializeComponent();
IDictionary<string, object> state = Microsoft.Phone.Shell.PhoneApplicationService.Current.State;
if (!state.ContainsKey(STATE_WAS_LOADED))
{
state[STATE_WAS_LOADED] = "LOADED";
this.LayoutRoot.Visibility = System.Windows.Visibility.Collapsed;
_popup = new Popup();
_popup.Child = new NPGSplash();
System.Diagnostics.Debug.WriteLine("{0}: Displaying Splash Popup", DateTime.Now.ToString("ss.ffff"));
_popup.IsOpen = true;
// Asynchronously load the biggest dataset
StartLoadingData();
}
}
private void StartLoadingData()
{
_worker = new BackgroundWorker();
_worker.DoWork += new DoWorkEventHandler(_worker_DoWork);
_worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(_worker_RunWorkerCompleted);
_worker.RunWorkerAsync();
}
void _worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
this.Dispatcher.BeginInvoke(() =>
{
System.Diagnostics.Debug.WriteLine("{0}: Splash RunWorkerCompleted", DateTime.Now.ToString("ss.ffff"));
this.LayoutRoot.Visibility = System.Windows.Visibility.Visible;
this._popup.IsOpen = false;
});
}
EDIT:
На этой неделе я купил устройство на eBay, чтобы не выпускать приложение, в котором я не могу подтвердить, что оно работает должным образом. Я могу подтвердить, что, какая бы проблема ни была, она НЕ возникает при запуске приложения на устройстве. Хорошие новости. Тем не менее, я не могу объяснить, что, как мне кажется, составляет примерно 3-5 секундную паузу в моем приложении после вызова сотрудника. Я даже изменил свою логику в конструкторе, чтобы установить System.Windows.Threading.DispatcherTimer
на 100 мс, чтобы запустить мою логику. Когда этот код выполняется, конструктор завершается, но таймер не тикает в течение 3-5 секунд. Очень странно, и только в симуляторе, когда он не подключен к отладчику.