在我发布的UWP应用程序中,我一直在努力工作一周,但在手机(ARM目标)上部署时,它似乎只能在发布模式中体现出来。当从一个特定页面导航到另一个页面时,它会使应用程序崩溃。它只会影响这两个特定页面,即使它们的结构与项目中从未显示此行为的许多其他页面相同(使用OnNavigatedTo和OnLoaded来呈现内容并填充ViewModel等)
我唯一的线索(因为我无法获得完整的堆栈跟踪)是这个错误消息,我通过反复试验很难得到:
这似乎很通用,我在尝试时尝试了几件事:
经过大量阅读后,我试图摆弄项目设置中的编译选项,发现有问题的配置已经激活了.NET本机工具链编译和代码优化复选框。我设法在调试模式下重现崩溃并激活了这些选项(基本上使用应用程序直到随机出现错误)但由于正好激活了这些设置,我没有堆栈跟踪。调试器只是打破Unhandled XAML异常行,甚至启动它的方法的sender和e参数“目前还不可访问”。
另一方面,我的手机上有一些minidump,我无法在Visual Studio 2015中调试。它找不到kenelbase.pdb符号,即使我在配置上检查了Microsoft Symbol Servers
我无法将应用程序上传到商店,即使我选中了.NET本机编译选项(它似乎需要两者,否则网站会在验证过程中抛出错误),所以我的用户最终会遇到错误。如果有人有任何指示或想法,我将非常感激。
VS Enterprise 2015,W10M编译10586.107在Lumia 925上运行。我希望我知道为什么它不会更新到.164。
我注意到当崩溃发生时,我的视图中没有一个图像被加载。有一些BitmapIcons从捆绑内容(png)加载,两个图像从网络加载,使用IValueConverter将它们转换为BitmapImage,因此,ImageSources。我已检查并重新检查转换器的空值和异常,应该清楚。
父视图,触发导航的事件:
private void SessionList_ItemClick(object sender, ItemClickEventArgs e)
{
Frame.Navigate(typeof(ClubPage), e.ClickedItem); // The collection is binded, so the clicked item is a model
}
在崩溃视图上执行的代码:
private void ClubPage_Loaded(object sender, RoutedEventArgs e)
{
isInfoShowing = false;
isLogoZoomed = false;
compositor = ElementCompositionPreview.GetElementVisual(sender as UIElement).Compositor;
Visual status = ElementCompositionPreview.GetElementVisual(StatusBlock);
status.Opacity = 0.0f;
ClubViewModel.Current.ShowIn = false;
ClubViewModel.Current.ShowComing = false;
}
protected override async void OnNavigatedTo(NavigationEventArgs e)
{
if (e.Parameter != null)
{
ClubViewModel.Current.Club = e.Parameter as Club;
SplitViewShellViewModel.Current.Title = ClubViewModel.Current.Club.Name.Replace("_", " ");
SplitViewShellViewModel.Current.TitleBarOpacity = 1.0f;
ClubViewModel.Current.InLimit = App.RefreshLimit;
ClubViewModel.Current.ComingLimit = App.RefreshLimit;
await ClubViewModel.Current.GetClub(); //I'm positive that up until this point the code is executed
await ClubViewModel.Current.GetPeopleIn();
await ClubViewModel.Current.GetClubNotifications();
}
}
激活本机调试会给我以下stacktrace。 DispatcherTimer勾选时会引发异常(我的视图中没有,一切都是内部的)。除此之外,我无法理解它。
我已经尝试了所有我能想到的东西,并且我也重构了我的全部观点。我正在做的唯一“奇怪”的事情是容器中的ListView打破了它的虚拟化,但我并不关心性能,因为列表非常小。
答案 0 :(得分:2)
这非常奇怪(至少对我而言),但显然上面显示的导航代码并没有在Dispatcher线程上执行......即使它是由UI事件触发的。按如下方式将调用发送给调度员可以解决问题:
private async void SessionList_ItemClick(object sender, ItemClickEventArgs e)
{
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => Frame.Navigate(typeof(ClubPage), e.ClickedItem));
}
在整个应用程序中传播的相同代码(没有显式的Dispatcher.RunAsync包装器)按预期工作。每次我遇到UI线程问题时,抛出的异常都被管理并且易于重现......在编译器优化过程中可能会发生什么,可能会触发这个?