MultipleMessageDialogApplicationCrash我在我的应用程序的几个地方使用了MessageDialogues。问题是,每当MessageDialog(或系统警报,如功能警报)处于活动状态并且调用我的另一个MessageDialog时,应用程序将无一例外地崩溃或出现UnathorizedAccessException。这就是我调用MessageDialog的方式:CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,()=>{MessageDialogmsg2=newMessageDialog(_resourceLoader.GetString("MsgGPSUnavailable"));msg2.ShowAsync();});我想我应该等待对话框关闭,但是通过使用Dispatcher,我将这个对话框排队到主UI线程,它自己处理这个?感谢您对此问题的任何解释。编辑-我一步一步地获得了以下代码,它包含在同一个类中。当我运行该应用程序时,会调用LoadDataToModel。没关系,msgGPSDisabled会显示对话框。之后引发事件并调用locator_StatusChanged。这也很好,并显示对话框。现在是奇怪的部分。当我不在LoadDataToModel中调用msgGPSDisabled并且仅在locator_StatusChanged中调用时,应用程序会在显示对话框后立即崩溃。无一例外,第47行打开App.gics(DEBUG&&!DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION)。即使我使用try-catch也能正常工作。当我在locator_StatusChanged中使用没有Dispatcher的msgGPSDisabled时,会抛出异常。不可捕获,“找不到物品”publicasyncTaskLoadDataToModel(){awaitmsgGPSDisabled();this.IsBusy=true;等待LoadDataGarvis(站);//rozparsujerawdataana?tejedomodeluInitializePins();this.IsBusy=false;}voidlocator_StatusChanged(Geolocatorsender,StatusChangedEventArgsargs){switch(sender.LocationStatus){caseWindows.Devices.Geolocation.PositionStatus.Disabled:try{CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,async()=>{awaitmsgGPSDisabled();IsGPSBusy=false;IsGPS=false;});}catch(UnauthorizedAccessException){抛出;}赶上(异常){抛出;}caseWindows.Devices.Geolocation.PositionStatus.NoData:CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,async()=>{awaitmsgGPSUnavailable();});}}privateasyncTaskmsgGPSDisabled(){MessageDialogsss=newMessageDialog(_resourceLoader.GetString("MsgGPSDisabled"));等待sss.ShowAsync();}不能同时显示两个MessageDialogs如果你想继续使用MessageDialogs,你有几个选择,最好有一些MessageDialogService来管理显示对话框的调用:如果你想使用队列选项-你可以使用下面的代码:usingSystem;使用System.Threading.Tasks;使用Windows.Foundation;使用Windows.UI.Popups;使用Windows.UI.Xaml;namespaceWinRTXamlToolkit.Controls.Extensions{//////MessageDialog扩展方法///publicstaticclassMessageDialogExtensions{privatestaticTaskCompletionSource_currentDialogShowRequest;/////开始显示对话框的异步操作。///如果另一个对话框已经使用///ShowAsyncQueue或ShowAsyncIfPossible方法显示-它会等待///在显示新对话框之前关闭前一个对话框。/////对话框。//////此方法只能从UI线程调用。publicstaticasyncTaskShowAsyncQueue(thisMessageDialogdialog){if(!Window.Current.Dispatcher.HasThreadAccess){thrownewInvalidOperationException(“此方法只能从UI线程调用。”);}尽管(_currentDialogShowRequest!=null){await_currentDialogShowRequest.Task;}varrequest=_currentDialogShowRequest=newTaskCompletionSource();varresult=awaitdialog.ShowAsync();_currentDialogShowRequest=null;request.}Result}log;result}(你的lambda应该仍然等待异步调用,这样当调度程序运行它时,它不会继续,直到消息框关闭我还没有尝试过,但这应该有帮助(注意async和await关键字的用法):CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,async()=>{MessageDialogmsg2=newMessageDialog(_resourceLoader.GetString("MsgGPSUnavailable"));awaitmsg2.ShowAsync();});编辑:正如Filip已经解释的那样,你不能同时显示多个消息框。他还建议了一些可以用来避免问题的方法。在你的场景中(报告GPS状态的变化),最好将状态显示为UI内的标签,因为您实际上不需要用户以任何方式对其做出响应。您甚至可以在列表中更改时收集值并使用ItemsControl以便用户可以观察更改的历史记录(可能带有时间戳)。这完全取决于您想要实现的目标。以上就是C#学习教程:多个MessageDialog应用程序共享崩溃的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权请点击右侧联系管理员删除。如需转载请注明出处:
