Ich habe eine UWP-App und ich habe OnBackRequested(object sender, BackRequestedEventArgs e)
, in ein paar Orten. Ich habe jedoch ein interessantes Problem gefunden. Das ist, wenn ich hinzufügen async
zu einigen der OnBackRequested
Ereignis, ich werde tatsächlich erhalten zurück button merken, wie oft es angezapft wurde. Das heißt, das erste Mal, wenn ich darauf klicke, wird async OnBackRequested
einmal ausgelöst, und die zweite klicke ich darauf, async OnBackRequested
wird zweimal ausgelöst und so weiter. Ich frage mich, ob dies ein Betriebssystemfehler oder irgendetwas anderes ist. Und wie kann ich das beheben? Vielen Dank!Warum BackRequested-Ereignis wird nach dem Hinzufügen von Async in UWP mehrmals ausgelöst?
Antwort
Ich denke, dass Sie vergessen, den Handler von OnBackRequested zu entfernen.
Wenn neue Seite navigiert, ich glaube, Sie haben:
OnBackRequested += .....
Aber wenn man von ihr navigieren, vergessen Sie OnBackRequested -= ......
Es funktioniert, danke! Ich denke, GC hat die Arbeit für mich erledigt, für diejenigen, die nicht asynchron sind, was denkst du? – litaoshen
Um zu nennen zu erklären, warum BackRequested
zweimal passiert, wenn Sie Ihren Handler machen async: Dies liegt daran, dass Sie vor dem Festlegen von Handled = true
eine asynchrone Operation ausführen. Wenn Sie eine Methode als async
deklarieren, stellt die Methode bei Ausführung einer await
eine Aufgabe in die Warteschlange und kehrt zurück. Wenn die erwartete Sache abgeschlossen ist, wird die in die Warteschlange gestellte Aufgabe ausgeführt, und diese Aufgabe nimmt die Ausführung der Methode wieder auf (bis zum nächsten await
).
Der Ereignishandler BackRequested
weiß nicht, dass Sie eine Aufgabe in die Warteschlange gestellt haben. Es wird angezeigt, dass der Handler zurückgegeben hat und überprüft, ob Sie Handled
festgelegt haben und Sie Handled = true
(noch) nicht festgelegt haben, dass der Handler das Ereignis BackRequested
nicht behandeln wollte, sodass es den nächsten Handler aufruft.
Was Sie also sehen, ist die Kombination von zwei Problemen.
- Sie haben eine
await
vor der EinstellungHandled = true
durchgeführt. - Sie haben mehr als einen Handler.
Sie immer noch ein Problem: Da Ihr Handler nicht Handled = true
Einstellung wird vor seinem await
Durchführung schließt der BackRequested
Fall, dass Sie das Ereignis nicht verarbeiten haben, und es wird versucht, für Sie das Ereignis zu behandeln (wahrscheinlich durch Navigieren zur vorherigen App).
TL; DR: Stellen Sie sicher, dass Sie Handled = true
vor dem ersten asynchronen Vorgang festlegen, wenn Sie im Ereignis BackRequested
asynchrone Vorgänge ausführen.
- 1. Warum wird `filter` mehrmals ausgelöst?
- 2. Warum wird $ (form) .submit (e) mehrmals ausgelöst?
- 3. PostAuthenticateRequest wird mehrmals ausgelöst
- 4. Warum wird nach dem mouseDown -Ereignis auf demselben Element nicht ausgelöst, wenn ein Ereignis ausgelöst wird?
- 5. Warum wird meine Funktion mehrmals nach Update ausgeführt wird geladen
- 6. jquery Click-Ereignis ausgelöst wird mehrmals :(
- 7. Warum wird WebBrowser_DocumentCompleted() zweimal ausgelöst?
- 8. Warum wird didBeginContact mehrmals aufgerufen?
- 9. Warum wird contextInitialized() mehrmals aufgerufen?
- 10. UWP Progress Bar in Async-Methode C#
- 11. UITableView Push segue ausgelöst mehrmals
- 12. Warum Binding eine System.ArgumentException ausgelöst wird, wenn ein Mitglied Hinzufügen
- 13. uwp async-Methode überspringt Codezeilen
- 14. Jquery-Ereignisse werden mehrmals ausgelöst
- 15. Debugging Lebenslauf nach dem Vorstart in UWP
- 16. Warum wird das MouseDoubleClick-Ereignis von TreeViewItem mehrmals per Doppelklick ausgelöst?
- 17. Warum wird der HttpApplication-Konstruktor mehrmals aufgerufen?
- 18. HttpModule Init-Methode wird mehrmals aufgerufen - warum?
- 19. Warum wird der Entscheider mehrmals aufgerufen?
- 20. $ .ajax ({async: false}) Anfrage wird noch asynchron ausgelöst?
- 21. Canvas-Manipulationsereignis, das erst nach dem ersten Versuch ausgelöst wird
- 22. System.Timers.Timer: Wie wird das verstrichene Ereignis nach dem Startintervall ausgelöst?
- 23. on ('click' ....) wird nur nach dem zweiten Klick ausgelöst
- 24. Warum wird setUpClass (cls): mehrmals ausgeführt?
- 25. Funktion wird mehrmals in vimscript
- 26. Warum wird afterSave() in app_model.php immer ausgelöst?
- 27. UWP Listenansicht Hinzufügen von großen Datenmengen
- 28. Funktion einmal aufgerufen, aber mehrmals ausgelöst
- 29. Hinzufügen von Abständen in UWP StackPanels
- 30. Redraw UITableView nach dem Aktualisieren von Daten async
Es sieht so aus, als ob du dein Ereignis mehr als einmal an BackRequested anfügst ... – Gusman
Also, bevor du das 'async' hinzufügst, feuert es nur einmal? – Stamos
@Stamos Ich habe ein paar Orte hat Backrequested, jeder ohne Async wird einmal ausgelöst werden, aber die Async wird mehrmals ausgelöst werden. Es wurde tatsächlich durch Nichtabmeldung verursacht. Ich denke, das unasync funktioniert wegen GC – litaoshen