2016-07-07 52 views
0

Zunächst einmal der Code, der ohne Fehler läuft, aber deckt nicht alles, was ich es brauche:Halt Code der Ausführung, aber nicht die Anwendung

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

} 

Die Grundvoraussetzung ist, dass, wenn es nicht sicher ist, zu retten In einem Meldungsdialog wird dem Benutzer mitgeteilt, dass die App neu gestartet werden muss, und dann "Application.Current.Exit()" ausführen, wenn sie dann auf die Schaltfläche "Okay" tippen.

Mein Problem ist, dass ich meinen Code brauche, um die Ausführung zu beenden, wenn der Neustart getroffen wird. Im Augenblick beendet 'return' nur diese Methode, aber danach wird es andere Dinge in der Methode, die SaveData() aufgerufen hat, fortsetzen, bis meine restartMessage wirksam wird, und das ist nicht gut.

Ich überlegte, 'Application.Current.Exit()' über die 'return' Anweisung zu setzen, aber das wird die Dinge herunterfahren, bevor meine Fehlermeldung zu sehen ist. Was auch nicht gut ist.

Die andere Lösung war das Überspringen der gesamten CoreDispatcher-Sache und das Ausführen von ShowAsync() allein, außer das würde einen anderen bekannten Fehler auslösen. Grundsätzlich habe ich ein paar MessageDialogs, die die SaveData() -Methode aufrufen und einen MessageDialog öffnen, wenn ein anderer MessageDialog bereits geöffnet ist, ist wiederum nicht gut.

Das ist es: Ich brauche etwas, um zu verhindern, dass mein Codeformular ausgeführt wird, ohne die gesamte Anwendung zu beenden oder die Anzeige meiner Fehlermeldung zu verhindern. Was kann ich tun?

+0

Sie müssen warten, bis der Benutzer auf die Schaltfläche OK klickt. Verwenden Sie MessageDialog.Commands. –

+0

Das mache ich jetzt. Mein Problem war, dass der Code weiterhin ausgeführt wird, bis das passiert, und ich möchte es nicht. Kann ich damit aufhören? –

Antwort

0

Kurze Version, habe ich diese Lösung Kerl: MessageDialog ShowAsync throws accessdenied exception on second dialog

Da ich nicht kontrollieren kann, wenn der Dispatcher auftreten wird, ist es notwendig, sie verschrotten. Jetzt sagte ich, ich könnte das nicht machen, weil es einen anderen Bug verhinderte, also habe ich den Ratschlag in diesem Link benutzt, um diesen Bug auf eine andere Art zu verhindern ... so kann ich jetzt den Dispatcher abzweigen und meine Anwendung zwingen, mit meinem umzugehen Nachrichtendialog, ohne dass es seinen Multithread-Pfad fortsetzt und Dinge tut, die es nicht tun sollte!

Code für meine Lösung wird in die SafeToSave() - Methode verschoben. Ich tat, was in dieser Verbindung der Kerl tat und änderte dann das:

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

In diese:

await restartMessage.ShowAsync(); 

Und im Gegensatz zu, bevor ich bin kein Zugriffsfehler für den Aufruf ShowAsync(), während ein anderes MessageDialog bekommen ist schon oben, weil ich es gewaltsam zuerst schließe.