Приложение для Windows Phone аварийно завершает работу при слишком раннем использовании NavigationService.GoBack()

Несмотря на то, что NavigationService.CanGoBack возвращает True, NavigationService.GoBack() выдает мне следующие исключения:

A first chance exception of type 'System.ArgumentException' occurred in System.Windows.dll
A first chance exception of type 'System.Reflection.TargetInvocationException' occurred in 

Это происходит систематически в двух случаях, а третий работает нормально:

  • Сбой, если я позвоню NavigationService.GoBack() в OnNavigatedTo()
  • Сбои Если я звоню NavigationService.GoBack() в результате WebException, брошенного в мой HTTPWebRequest, когда Интернет недоступен [1]
  • Работает нормально, если Интернет доступен, и я звоню NavigationService.GoBack(), когда мой HTTPWebRequest получает результаты, анализирует их и отображает.

Моя теория заключается в том, что я не могу вызвать GoBack() слишком быстро после перехода со страницы на другую... Мой вопрос: Как я могу программно вернуться вверх по стеку навигации, когда HTTPWebRequest не загружается?

Редактировать: я решил сделать это по-другому, но я думаю, что мои проблемы могут быть связаны с навигационной анимацией и набором инструментов C# для Windows Phone (я использую выпуск от февраля 2011 г.)


[1] Подробная информация о моем коде в случае 2:

У меня простой HTTPWebRequest. Мой обратный вызов делает это, и мое приложение вылетает в режиме полета. Ответственной является строка NavigationService.GoBack(), хотя NavigationService.CanGoBack возвращает true.

        try
        {
            response = request.EndGetResponse(result);
        }
        catch (WebException)
        {
            Dispatcher.BeginInvoke(() =>
            {
                NavigationService.GoBack();
            });
        }

Я также пытался использовать Deployment.Current.Dispatcher.BeginInvoke().


person Thomas Joulin    schedule 07.10.2011    source источник
comment
Мое первое предположение заключалось в том, что вы должны обязательно выполнить NavigationService.GoBack() в потоке пользовательского интерфейса, но это то, что вы, по-видимому, делаете... Вы проверили, загружается ли страница, на которую вы возвращаетесь? Может быть, эта страница вызывает эти исключения?   -  person Volker Voecking    schedule 07.10.2011
comment
Ты прав. Если я делаю NavigationService.GoBack() вместо HTTPWebRequest, то GoBack() в улове у меня те же исключения! Но я даже не добираюсь до своего OnNavigatedTo ! Если у меня есть Интернет, выполните веб-запрос и вызовите GoBack в основном потоке, как только запрос будет успешным, но это сработает. Я предполагаю, что GoBack не работает, если это происходит слишком рано? я обновлю свой вопрос   -  person Thomas Joulin    schedule 07.10.2011


Ответы (1)


Вы можете попробовать использовать WebClient client = new WebClient();, затем использовать client.DownloadStringAsync(new Uri("request_url"));, чтобы сделать запрос и подписаться на событие client.DownloadStringCompleted, чтобы получить ваши данные, когда запрос будет выполнен. После анализа данных в обработчике событий вы можете вызвать NavigationService.GoBack(); или перейти на любую нужную страницу.

Кроме того, если вы попытаетесь сделать что-то в событии OnNavigatedTo и у вас возникнут проблемы, вы можете попробовать использовать вместо этого OnNavigatingFrom (на предыдущей странице ofc), отменить навигацию e.Cancel = true;, сделать свое дело, как сделать запрос и прочее, затем получить кадр приложения и перейдите к e.Uri (фактически продолжая навигацию, которую вы ранее отменили).

Хотя это второе может также представлять собой решение, я думаю, что первое лучше, поскольку оно выполняет всю работу асинхронно, поэтому не блокирует ваш поток пользовательского интерфейса. Это то, что я обычно использую в своих приложениях. Надеюсь, поможет.

person Marius Bughiu    schedule 21.10.2011