2016-04-28 7 views
0

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?

+0

Es sieht so aus, als ob du dein Ereignis mehr als einmal an BackRequested anfügst ... – Gusman

+0

Also, bevor du das 'async' hinzufügst, feuert es nur einmal? – Stamos

+0

@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

Antwort

0

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

+0

Es funktioniert, danke! Ich denke, GC hat die Arbeit für mich erledigt, für diejenigen, die nicht asynchron sind, was denkst du? – litaoshen

1

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.

  1. Sie haben eine await vor der Einstellung Handled = true durchgeführt.
  2. 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.

Verwandte Themen