C#学习教程:多个MessageDialog应用程序崩溃分享


多个MessageDialog应用程序崩溃

我在我的应用程序的几个地方使用MessageDialogues 。 问题是,无论何时MessageDialog (或系统警报,如function警告)处于活动状态,而另一个我的MessageDialog被调用,应用程序将无exception或使用UnathorizedAccessException崩溃。

这就是我如何调用MessageDialog:

 CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { MessageDialog msg2 = new MessageDialog(_resourceLoader.GetString("MsgGPSUnavailable")); msg2.ShowAsync(); }); 

我以为我应该等待关闭对话框,但是通过使用Dispatcher我将这个对话框排队到主UI线程,它自己处理这个问题? 谢谢你对这个问题的任何解释。

编辑 – 我继续一步一步地得到以下代码,它包含在同一个类中。 当我运行app时,会调用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时,会引发exception。 不可捕获,“找不到物品”

 public async Task LoadDataToModel() { await msgGPSDisabled(); this.IsBusy = true; await LoadDataGarvis(Stations); //rozparsuje raw data a načte je do modelu InitializePins(); this.IsBusy = false; } void locator_StatusChanged(Geolocator sender, StatusChangedEventArgs args) { switch (sender.LocationStatus) { case Windows.Devices.Geolocation.PositionStatus.Disabled: try { CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () => { await msgGPSDisabled(); IsGPSBusy = false; IsGPS = false; }); } catch (UnauthorizedAccessException) { throw; } catch (Exception) {throw; } case Windows.Devices.Geolocation.PositionStatus.NoData: CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () => { await msgGPSUnavailable(); }); } } private async Task msgGPSDisabled() { MessageDialog sss = new MessageDialog(_resourceLoader.GetString("MsgGPSDisabled")); await sss.ShowAsync(); } 

无法同时显示两个MessageDialogs 。 如果你想继续使用MessageDialogs ,你有几个选择,并且最好有一些MessageDialogService来管理调用以显示对话框:

如果您想使用队列选项 – 您可以使用以下代码:

 using System; using System.Threading.Tasks; using Windows.Foundation; using Windows.UI.Popups; using Windows.UI.Xaml; namespace WinRTXamlToolkit.Controls.Extensions { ///  /// MessageDialog extension methods ///  public static class MessageDialogExtensions { private static TaskCompletionSource _currentDialogShowRequest; ///  /// Begins an asynchronous operation showing a dialog. /// If another dialog is already shown using /// ShowAsyncQueue or ShowAsyncIfPossible method - it will wait /// for that previous dialog to be dismissed before showing the new one. ///  /// The dialog. ///  /// This method can only be invoked from UI thread. public static async Task ShowAsyncQueue(this MessageDialog dialog) { if (!Window.Current.Dispatcher.HasThreadAccess) { throw new InvalidOperationException("This method can only be invoked from UI thread."); } while (_currentDialogShowRequest != null) { await _currentDialogShowRequest.Task; } var request = _currentDialogShowRequest = new TaskCompletionSource(); var result = await dialog.ShowAsync(); _currentDialogShowRequest = null; request.SetResult(dialog); return result; } } } 

你的lambda仍然应该等待异步调用,这样当调度程序运行它时,它将不会继续,直到消息框关闭。

我没有尝试过,但这应该有所帮助(注意asyncawait关键字的用法):

 CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () => { MessageDialog msg2 = new MessageDialog(_resourceLoader.GetString("MsgGPSUnavailable")); await msg2.ShowAsync(); }); 

编辑:

正如Filip已经解释过的那样,您不能同时显示多个消息框。 他还提出了一些可以用来避免问题的方法。

在您的场景中(报告有关GPS状态的变化),最好将状态显示为UI内的标签,因为您并不需要用户以任何方式对其进行响应。 您甚至可以在列表中更改时收集值并使用ItemsControl显示它们,以便用户可以观察更改的历史记录(可能带有时间戳)。 这一切都取决于你想要达到的目标。

上述就是C#学习教程:多个MessageDialog应用程序崩溃分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—猴子技术宅(www.ssfiction.com)

本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

如若转载,请注明出处:https://www.ssfiction.com/ckf/1031661.html

发表评论

邮箱地址不会被公开。 必填项已用*标注