#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
(в основном продолжая навигацию, которую вы ранее отменили).
Хотя это второе также может представлять собой решение, я думаю, что первое лучше, поскольку оно выполняет всю работу асинхронно, не блокируя ваш поток пользовательского интерфейса. Это то, что я обычно использую в своих приложениях. Надеюсь, это поможет.