首先是代码,它运行没有错误,但并没有涵盖我需要它的所有内容:
public async Task SaveData()
{
// MessageDialog restartMessage;
// ^^ This was made global and is defined in SafeToSave()
// Check if it's safe to save
await SafeToSave();
if (restartMessage != null)
{
CoreDispatcher cD = Window.Current.CoreWindow.Dispatcher;
await cD.RunAsync(CoreDispatcherPriority.Normal, async () =>
{
await restartMessage.ShowAsync();
// This WILL invoke 'Application.Current.Exit()'
});
return;
// Issue is right around here...
}
// Other code...
}
基本前提是,如果保存不安全,则消息对话框将告诉用户应用程序需要重新启动,然后在点击"确定"按钮时执行"Application.Current.Exit()"。
我的问题是我需要我的代码在重新启动时停止执行。现在"return"只结束了这个方法,但之后它将继续在调用 SaveData() 的方法中做其他事情,直到我的 restartMessage 生效,这不好。
我考虑过将"Application.Current.Exit()"放在"return"语句上方,但这会在看到我的错误消息之前关闭。这也不好。
另一个解决方案是跳过整个CoreDispatcher的事情,只运行ShowAsync(),除了这会触发不同的已知错误。基本上,我有一些调用SaveData()方法的MessageDialog,当另一个MessageDialog已经打开时打开一个MessageDialog又不好。
就是这样:我需要一些东西来阻止我的代码表单执行,而不会杀死整个应用程序或阻止我的错误消息显示。我能做什么?
简短版本,我使用了这家伙的解决方案: 消息对话框 ShowAsync 在第二个对话框中抛出拒绝访问异常
由于我无法控制调度程序何时发生,因此有必要报废它。现在我说我不能这样做,因为它可以防止另一个错误,所以我使用该链接中的建议以不同的方式防止该错误......所以现在我可以放弃调度程序并强制我的应用程序处理我的消息对话框,而无需它继续沿着其多线程路径并做它不应该做的事情!
我的解决方案的代码被移动到 SafeToSave() 方法中。我做了那个链接中的人所做的事情,然后改变了这个:
CoreDispatcher cD = Window.Current.CoreWindow.Dispatcher;
await cD.RunAsync(CoreDispatcherPriority.Normal, async () =>
{
await restartMessage.ShowAsync();
});
进入这个:
await restartMessage.ShowAsync();
与以前不同的是,当另一个 MessageDialog 已经启动时,我没有收到调用 ShowAsync() 的访问错误,因为我先强制关闭它。