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

#windows-phone-7 #httpwebrequest #dispatcher #navigationservice

#windows-phone-7 #httpwebrequest #диспетчер #navigationservice

Вопрос:

Несмотря 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 сбое загрузки?

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


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

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

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

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

Комментарии:

1. Мое первое предположение заключалось в том, что вы должны обязательно выполнить NavigationService. GoBack() в потоке пользовательского интерфейса, но это то, что вы, по-видимому, делаете… Вы проверили, загружается ли страница, на которую вы возвращаетесь? Может быть, эта страница вызывает эти исключения?

2. Вы правы. Если я делаю NavigationService.GoBack() вместо HTTPWebRequest then GoBack() в catch, у меня те же исключения! Но я даже не добираюсь до своего OnNavigatedTo ! Если у меня есть Интернет, выполните веб-запрос и вызовите GoBack в главном потоке, как только запрос будет выполнен успешно, он все же сработает. Я предполагаю, что возврат завершается неудачей, если это происходит слишком рано? Я обновлю свой вопрос

Ответ №1:

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

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

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