Xamarin表单:等待NavigationPage.PushAsync导致应用程序崩溃

时间:2016-11-09 06:57:40

标签: xamarin xamarin.forms mvvm-light

我面临一个奇怪的错误。我们正在构建一个Xamarin Forms应用。我们使用了MVVM Light框架并使用导航服务在页面之间导航。我们使用Mark's Implementation添加了一些内容。但主要是我们使用异步函数,因此Navigate函数是

 public async Task NavigateTo(string pageKey, object parameter)

和一些差异

Device.OnPlatform(Android: () => NavigationPage.SetHasNavigationBar(page, false));    
await _navigation.PushAsync(page, false);

现在整整一个月工作正常。是的,从那时起我们已经对应用程序进行了大量更改,但导航服务本身保持不变。今天,我们开始得到这个异常 System.ObjectDisposedExceptionCannot访问已处置的对象。对象名称:' Xamarin.Forms.Platform.Android.PageContainer'。

我附加了我们从Insights获得的整个Raw堆栈跟踪。

  

System.ObjectDisposedExceptionCannot访问已处置的对象。对象名称:' Xamarin.Forms.Platform.Android.PageContainer'。   生的     在Java.Interop.JniPeerMembers.AssertSelf(Java.Interop.IJavaPeerable self)[0x00030] /Users/builder/data/lanes/3819/5a02b032/source/Java.Interop/src/Java.Interop/Java.Interop/JniPeerMembers的.cs:153     at Java.Interop.JniPeerMembers + JniInstanceMethods.InvokeVirtualVoidMethod(System.String encodedMember,Java.Interop.IJavaPeerable self,Java.Interop.JniArgumentValue * parameters)[0x00002]在/ Users / builder / data / lanes / 3819 / 5a02b032 / source / Java.Interop / src目录/ Java.Interop / Java.Interop / JniPeerMembers.JniInstanceMethods_Invoke.cs:21     位于/Users/builder/data/lanes/3819/5a02b032/source/monodroid/src/Mono.Android/platforms/android-23/src中的Android.Views.View.set_Visibility(Android.Views.ViewStates值)[0x00017] /generated/Android.Views.View.cs:10321     在X:C:\ BuildAgent2 \ work \ aad494dc9bc9783 \ Xamarin.Forms.Platform.Android中的Xamarin.Forms.Platform.Android.NavigationRenderer.SwitchContentAsync(Xamarin.Forms.Page视图,System.Boolean动画,System.Boolean已移除)[0x002d7] \渲染器\ NavigationRenderer.cs:319     在C:\ BuildAgent2 \ work \ aad494dc9bc9783 \ Xamarin.Forms.Platform.Android \ Renderers \ NavigationRenderer中的Xamarin.Forms.Platform.Android.NavigationRenderer.OnPushAsync(Xamarin.Forms.Page视图,System.Boolean动画)[0x00000]。 CS:142     在C:\ BuildAgent2 \ work \ aad494dc9bc9783 \ Xamarin.Forms.Platform.Android \ Renderers \ NavigationRenderer中的Xamarin.Forms.Platform.Android.NavigationRenderer.PushViewAsync(Xamarin.Forms.Page页面,System.Boolean动画)[0x00000]。 CS:36     at Xamarin.Forms.Platform.Android.NavigationRenderer.OnPushed(System.Object sender,Xamarin.Forms.Internals.NavigationRequestedEventArgs e)[0x00000]在C:\ BuildAgent2 \ work \ aad494dc9bc9783 \ Xamarin.Forms.Platform.Android \ Renderers \ NavigationRenderer.cs:175     at Xamarin.Forms.NavigationPage + d__90.MoveNext()[0x0006a]在C:\ BuildAgent2 \ work \ aad494dc9bc9783 \ Xamarin.Forms.Core \ NavigationPage.cs:355   ---从抛出异常的先前位置开始的堆栈跟踪结束---     在/Users/builder/data/lanes/3819/96c7ba6c/source/mono/mcs/class/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs中的System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()[0x0000c]中:143     在/ Users / builder / data / lanes / 3819 / 96c7ba6c / source / mono / mcs / class / referencesource / mscorlib / system中的System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(System.Threading.Tasks.Task任务)[0x00047] /runtime/compilerservices/TaskAwaiter.cs:187     在/ Users / builder / data / lanes / 3819 / 96c7ba6c / source / mono / mcs / class / referencesource / mscorlib / system中的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task任务)[0x0002e] /runtime/compilerservices/TaskAwaiter.cs:156     在/ Users / builder / data / lanes / 3819 / 96c7ba6c / source / mono / mcs / class / referencesource / mscorlib / system中的System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(System.Threading.Tasks.Task任务)[0x0000b] /runtime/compilerservices/TaskAwaiter.cs:128     在/Users/builder/data/lanes/3819/96c7ba6c/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs中的System.Runtime.CompilerServices.TaskAwaiter.GetResult()[0x00000] :113     at Xamarin.Forms.NavigationPage + d __48.MoveNext()[0x0017f]在C:\ BuildAgent2 \ work \ aad494dc9bc9783 \ Xamarin.Forms.Core \ NavigationPage.cs:180   ---从抛出异常的先前位置开始的堆栈跟踪结束---     在/Users/builder/data/lanes/3819/96c7ba6c/source/mono/mcs/class/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs中的System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()[0x0000c]中:143     在/ Users / builder / data / lanes / 3819 / 96c7ba6c / source / mono / mcs / class / referencesource / mscorlib / system中的System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(System.Threading.Tasks.Task任务)[0x00047] /runtime/compilerservices/TaskAwaiter.cs:187     在/ Users / builder / data / lanes / 3819 / 96c7ba6c / source / mono / mcs / class / referencesource / mscorlib / system中的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task任务)[0x0002e] /runtime/compilerservices/TaskAwaiter.cs:156     在/ Users / builder / data / lanes / 3819 / 96c7ba6c / source / mono / mcs / class / referencesource / mscorlib / system中的System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(System.Threading.Tasks.Task任务)[0x0000b] /runtime/compilerservices/TaskAwaiter.cs:128     在/Users/builder/data/lanes/3819/96c7ba6c/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs中的System.Runtime.CompilerServices.TaskAwaiter.GetResult()[0x00000] :113     at CustomerApp.Infrastructure.NavigationService + d _7.7.MoveNext()[0x000f1]在C:\ SVN Repos \ Jam Dev \ Trunk \ MobileApp \ CustomerApp \ CustomerApp \ CustomerApp \ Infrastructure \ Navigation \ NavigationService.cs:97   ---从抛出异常的先前位置开始的堆栈跟踪结束---     在/Users/builder/data/lanes/3819/96c7ba6c/source/mono/mcs/class/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs中的System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()[0x0000c]中:143     在/ Users / builder / data / lanes / 3819 / 96c7ba6c / source / mono / mcs / class / referencesource / mscorlib / system中的System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(System.Threading.Tasks.Task任务)[0x00047] /runtime/compilerservices/TaskAwaiter.cs:187     在/ Users / builder / data / lanes / 3819 / 96c7ba6c / source / mono / mcs / class / referencesource / mscorlib / system中的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task任务)[0x0002e] /runtime/compilerservices/TaskAwaiter.cs:156     在/ Users / builder / data / lanes / 3819 / 96c7ba6c / source / mono / mcs / class / referencesource / mscorlib / system中的System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(System.Threading.Tasks.Task任务)[0x0000b] /runtime/compilerservices/TaskAwaiter.cs:128     在/Users/builder/data/lanes/3819/96c7ba6c/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs中的System.Runtime.CompilerServices.TaskAwaiter.GetResult()[0x00000] :113     at CustomerApp.Infrastructure.NavigationService + d _6.MoveNext()[0x00030]在C:\ SVN Repos \ Jam Dev \ Trunk \ MobileApp \ CustomerApp \ CustomerApp \ CustomerApp \ Infrastructure \ Navigation \ NavigationService.cs:69   ---从抛出异常的先前位置开始的堆栈跟踪结束---     在/Users/builder/data/lanes/3819/96c7ba6c/source/mono/mcs/class/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs中的System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()[0x0000c]中:143     在/ Users / builder / data / lanes / 3819 / 96c7ba6c / source / mono / mcs / class / referencesource / mscorlib / system中的System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(System.Threading.Tasks.Task任务)[0x00047] /runtime/compilerservices/TaskAwaiter.cs:187     在/ Users / builder / data / lanes / 3819 / 96c7ba6c / source / mono / mcs / class / referencesource / mscorlib / system中的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task任务)[0x0002e] /runtime/compilerservices/TaskAwaiter.cs:156     在/ Users / builder / data / lanes / 3819 / 96c7ba6c / source / mono / mcs / class / referencesource / mscorlib / system中的System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(System.Threading.Tasks.Task任务)[0x0000b] /runtime/compilerservices/TaskAwaiter.cs:128     在/Users/builder/data/lanes/3819/96c7ba6c/source/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs中的System.Runtime.CompilerServices.TaskAwaiter.GetResult()[0x00000] :113     at CustomerApp.ViewModels.Login.LoginViewModel + d __36.MoveNext()[0x0024e]在C:\ SVN Repos \ Jam Dev \ Trunk \ MobileApp \ CustomerApp \ CustomerApp \ CustomerApp \ ViewModels \ Login \ LoginViewModel.cs:234

现在有趣的是,当我尝试调试并查看问题是什么时我决定在pushasync调用前删除await关键字,所以现在我的代码看起来像

Device.OnPlatform(Android: () => NavigationPage.SetHasNavigationBar(page, false));                    
_navigation.PushAsync(page, false);

瞧!它再次开始工作。虽然我很高兴它能够正常运作,但我只是想知道它为什么会这样做以及是什么原因造成的。我应该使用等待还是我不应该。有人可以解释一下吗?

0 个答案:

没有答案