0

まず、エラーなしで実行されますが、必要なすべてをカバーしていないコードから:

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...

}

基本的な前提は、保存するのが安全でない場合、メッセージ ダイアログがユーザーにアプリを再起動する必要があることを通知し、[OK] ボタンをタップすると、'Application.Current.Exit()' を実行することです。

私の問題は、再起動がヒットしたときにコードの実行を停止する必要があることです。現在、「return」はこのメソッドを終了するだけですが、その後、restartMessage が有効になるまで SaveData() を呼び出したメソッドで他のことを続けますが、これは良くありません。

「Application.Current.Exit()」を「return」ステートメントの上に置くことを検討しましたが、エラー メッセージが表示される前にシャットダウンしてしまいます。これも良くありません。

もう 1 つの解決策は、CoreDispatcher 全体をスキップし、ShowAsync() を単独で実行することでした。ただし、別の既知のエラーが発生する場合を除きます。基本的に、SaveData() メソッドを呼び出すいくつかの MessageDialogs があり、別の MessageDialog が既に開いているときに MessageDialog を開くのは、やはり良くありません。

それだけです。アプリケーション全体を強制終了したり、エラー メッセージの表示を妨げたりすることなく、コード フォームの実行を停止する何かが必要です。私に何ができる?

4

1 に答える 1

0

短いバージョン、私はこの男の解決策を使用しました: MessageDialog ShowAsync throws accessdenied exception on second dialog

Dispatcher がいつ発生するかを制御できないため、破棄する必要があります。別のバグを防いでいるので、それはできないと言ったので、そのリンクのアドバイスを使用して、別の方法でそのバグを防いだ...これで、ディスパッチャを捨てて、アプリケーションに強制的に対処させることができますマルチスレッド パスに沿って継続し、すべきでないことを行うことなく、メッセージ ダイアログを表示します。

私のソリューションのコードは SafeToSave() メソッドに移動されました。私はそのリンクの男がしたことをしてから、これを変更しました:

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

これに:

await restartMessage.ShowAsync();

以前とは異なり、別の MessageDialog が既に起動しているときに ShowAsync() を呼び出してもアクセス エラーは発生しません。これは、最初に強制的に閉じているためです。

于 2016-07-07T15:56:33.183 に答える