为什么在UWP中添加async后会多次触发BackRequested事件?

Why BackRequested event will be triggered multiple times after adding async in UWP?

我有一个 UWP 应用程序,我在几个地方添加了 OnBackRequested(object sender, BackRequestedEventArgs e)。但是我发现了一个有趣的问题。也就是说,当我将 async 添加到某些 OnBackRequested 事件时,我实际上会让后退按钮记住它被点击了多少次。也就是说,第一次点击时,async OnBackRequested会触发一次,第二次点击时,async OnBackRequested会触发两次,以此类推。我想知道这是 OS 错误还是其他问题。我该如何解决这个问题。谢谢!

我认为您忘记删除 OnBackRequested 的处理程序。

当导航到新页面时,我想你做了:

OnBackRequested += .....

但是当你从它导航时,你忘记调用 OnBackRequested -= ......

解释为什么当你使你的处理程序异步时 BackRequested 发生两次:这是因为你在设置 Handled = true 之前执行异步操作。当您将方法声明为 async 时,然后当它执行 await 时,该方法会排队任务和 returns。当等待的事情完成时,排队的任务运行,并且该任务恢复执行该方法(直到下一个 await)。

BackRequested 事件处理程序不知道您在排队任务。它看到处理程序返回,并检查您是否设置了 Handled,并且由于您还没有设置 Handled = true(还),它得出结论认为处理程序不想处理 [=10] =] 事件,所以它调用下一个处理程序。

所以您看到的是两个问题的组合。

  1. 您在设置 Handled = true 之前执行了 await
  2. 您有多个处理程序。

你还有一个问题:由于你的处理程序在执行它的 await 之前没有设置 Handled = trueBackRequested 事件断定你没有处理该事件,并且它将尝试为您处理事件(可能通过导航到上一个应用程序)。

TL;DR:如果您要在 BackRequested 事件中执行异步操作,请确保在您的第一个异步操作之前设置 Handled = true