Wie richte ich eine Ereignisschleife (Hauptschleife) in einer UWP
App ein?Einrichten einer Ereignisschleife für eine UWP-App
Mein Ziel ist es, eine App zu haben, die eine Hauptseite mit einer ständig aktualisierenden Berechnung hat, die dann ein Bild auf der Seite fortlaufend aktualisiert. Während dies ständig geschieht, kann der Benutzer auf eine Schaltfläche klicken, um das Berechnungsverhalten zu ändern oder auf eine zweite Seite zu gehen und zugehörige Daten zu bearbeiten.
Der Benutzer kann dann zurück auf die Hauptseite klicken und sehen, dass das Bild und die Berechnung neu starten und kontinuierlich aktualisieren. (Die Berechnung ist komplex, also sollte es so schnell wie möglich gehen und so viel App-Zeit wie möglich verbrauchen).
Wenn es einen Weg gibt, dies ohne eine Ereignisschleife zu erreichen, würde ich das gerne auch wissen, aber bis jetzt habe ich noch keinen Weg gefunden.
Mit einer Ereignisschleife kann ich einfach die Berechnung und Benutzeroberfläche jedes Mal durch die Schleife aktualisieren. Aber ich habe keinen Weg gefunden, dies zu tun. This question gefragt fast das gleiche, aber wurde nie direkt beantwortet und hatte einen anderen Anwendungsfall sowieso.
Die nächstgelegene ich zu einer Lösung gefunden habe, ist die CoreDispatcher
vom CoreWindow
und verwenden Sie die RunIdleAsync()
Methode zu greifen um eine Schleife zu erstellen:
public MainPage()
{
this.InitializeComponent();
Windows.UI.Core.CoreWindow appwindow = Windows.UI.Core.CoreWindow.GetForCurrentThread();
Windows.UI.Core.CoreDispatcher appdispatcher = appwindow.Dispatcher;
//create a continuously running idle task (the app loop)
appdispatcher.RunIdleAsync((dummyt) =>
{
//do the event loop here
.
.
.
if (appdispatcher.ShouldYield()) //necessary to prevent blocking UI
{
appdispatcher.ProcessEvents(Windows.UI.Core.CoreProcessEventsOption.ProcessAllIfPresent);
}
});
}
Das Hauptproblem dabei ist, dass Sie nicht zwischen wechseln Seiten (Sie erhalten eine Systemausnahme vom Versenden von Ereignissen innerhalb eines bereits versendeten Ereignisses).
Zweitens ist dies sehr chaotisch und erfordert die Aufrechterhaltung Extra-Status in der Ereignisschleife. Außerdem, warum sollte ich diese Verrenkungen durchgehen müssen, nur um einige Berechnungen durchzuführen, während die App auf Benutzereingaben wartet?
Gibt es eine Möglichkeit, dies zu tun (neben dem Wechsel zu einer C++ DirectX-App)?
Sie haben wahrscheinlich Recht, dass ich mehr über MVVM lernen muss. Können Sie mir eine Referenz vorschlagen, die auf die Art von Dingen abzielt, die ich erreichen möchte? Keine der Microsoft-Dokumentation leistet gute Arbeit. – mlt
Anfangs habe ich versucht, asynchrone Aufgaben zu verwenden. Ich habe aufgelegt, wo ich diese Aufgabe beginnen soll. Ich möchte, dass die Aufgabe gestartet wird, wenn ein Benutzer zur Hauptseite wechselt, aber nicht, dass der Benutzer auf eine Schaltfläche klicken muss, um ihn zu starten. Ich habe versucht, die 'OnLoaded()' Methode zu benutzen, um die Berechnung durchzuführen und meine Animation zu zeichnen, aber sie erreichte nie den Bildschirm (blieb in 'OnLoaded()' hängen). – mlt
@mlt Wahrscheinlich, weil Sie die Bindungen/Aufgaben nicht korrekt verwendet und den UI-Thread blockiert haben. Ich kenne keine Hinweise von oben auf meinen Kopf neben diesem: https://msdn.microsoft.com/en-us/library/hh848246.aspx Soweit was Sie erreichen möchten; Behalte einfach jede intensive Arbeit aus dem UI-Thread. – BradleyDotNET