暂停代码的执行,但不执行应用程序

时间:2016-07-07 11:17:21

标签: windows-runtime exit dispatcher messagedialog

首先关闭代码,该代码运行时没有错误,但并未涵盖我需要的所有内容:

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()'然后他们点击“好的”#39;按钮。

我的问题是,当重启时,我需要我的代码停止执行。现在'返回'只会结束这个方法,但之后它将继续在调用SaveData()的方法中做其他事情,直到我的restartMessage生效,并且这不好。

我考虑过将' Application.Current.Exit()'在'返回'之上声明,但在我看到错误信息之前会关闭。这也不好。

另一个解决方案是跳过整个CoreDispatcher并且只是自己运行ShowAsync(),除了会触发不同的已知错误。基本上我有一些MessageDialogs调用SaveData()方法并在另一个MessageDialog已经打开时打开一个MessageDialog再次不好。

关于它:我需要一些东西来阻止我的代码形式执行而不会杀死整个应用程序或阻止我的错误消息显示。我该怎么办?

1 个答案:

答案 0 :(得分:0)

简短版本,我使用了这个人的解决方案:MessageDialog ShowAsync throws accessdenied exception on second dialog

由于我无法控制Dispatcher何时发生,因此有必要废弃它。现在我说我不能这样做,因为它阻止了另一个bug,所以我使用该链接中的建议以不同的方式防止该bug ...所以现在我可以抛弃Dispatcher并强制我的应用程序处理我的消息对话框,没有它继续沿着它的多线程路径和做它不应该做的事情!

我的解决方案的代码被移入SafeToSave()方法。我做了那个链接中的人做了什么然后改变了这个:

CoreDispatcher cD = Window.Current.CoreWindow.Dispatcher;
await cD.RunAsync(CoreDispatcherPriority.Normal, async () =>
{
    await restartMessage.ShowAsync();
});

进入这个:

await restartMessage.ShowAsync();

与之前不同的是,当另一个MessageDialog已经启动时,我没有收到调用ShowAsync()的访问错误,因为我首先强行关闭它。