【问题标题】:Windows Phone App crashes when using NavigationService.GoBack() too soon过早使用 NavigationService.GoBack() 时 Windows Phone 应用程序崩溃
【发布时间】:2011-10-07 04:33:24
【问题描述】:

即使NavigationService.CanGoBack 返回TrueNavigationService.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 

这在两种情况下系统地发生,而第三种情况正常:

  • 如果我在 OnNavigatedTo() 中调用 NavigationService.GoBack()会崩溃
  • 如果我打电话给NavigationService.GoBack() 会崩溃由于在我的HTTPWebRequest 中抛出WebException 而导致在互联网不可用时 [1]
  • 如果 Internet 可用,并且当我的 HTTPWebRequest 得到结果、解析并显示结果时,我会调用 NavigationService.GoBack()

我的理论是我不能在从一个页面导航到另一个页面后过早调用GoBack()...我的问题:HTTPWebRequest 失败时,我如何以编程方式返回导航堆栈加载?

编辑:我决定换一种方式,但我认为我的问题可能是由于导航动画和 Windows Phone C# Toolkit(我使用 2011 年 2 月版)


[1] 我在案例 2 中的代码详情:

我有一个简单的HTTPWebRequest。我的回调会这样做,并且我的应用程序在飞行模式下崩溃。 NavigationService.GoBack() 行负责,即使 NavigationService.CanGoBack 返回 true

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

我也尝试使用Deployment.Current.Dispatcher.BeginInvoke()

【问题讨论】:

  • 我的第一个猜测是,您必须确保在 UI 线程上执行 NavigationService.GoBack(),但这显然是您正在做的事情......您是否检查过您正在导航的页面返回正在加载?如果导致这些异常,可能是那个页面?
  • 你是对的。如果我做NavigationService.GoBack() 而不是HTTPWebRequest 然后GoBack() 在一个catch 我有同样的例外!但我什至没有找到我的OnNavigatedTo!如果我有 Internet,请执行 Web 请求并在请求成功后在主线程上调用 GoBack,但它可以工作。我的猜测是如果它发生得太快,GoBack 会失败?我会更新我的问题

标签: windows-phone-7 httpwebrequest dispatcher navigationservice


【解决方案1】:

您可以尝试使用WebClient client = new WebClient();,然后使用client.DownloadStringAsync(new Uri("request_url")); 提出请求并订阅client.DownloadStringCompleted 事件以在请求完成时接收您的数据。解析数据后,您可以在事件处理程序中调用NavigationService.GoBack(); 或转到您想要的任何页面。

另外,如果您尝试在OnNavigatedTo 事件中做某事并遇到麻烦,您可以尝试改用OnNavigatingFrom(在c 的上一页上),取消导航e.Cancel = true;,按照以下方式执行您的操作发出请求和东西,然后获取应用程序框架并导航到e.Uri(基本上继续您之前取消的导航)。

虽然这第二个也可能代表一个解决方案,但我认为第一个更好,因为它可以异步完成所有工作,因此不会阻塞您的 UI 线程。这是我通常在我的应用程序中使用的。希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-25
    • 1970-01-01
    • 2014-06-02
    • 1970-01-01
    相关资源
    最近更新 更多