为什么在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] =] 事件,所以它调用下一个处理程序。
所以您看到的是两个问题的组合。
- 您在设置
Handled = true
之前执行了 await
。
- 您有多个处理程序。
你还有一个问题:由于你的处理程序在执行它的 await
之前没有设置 Handled = true
,BackRequested
事件断定你没有处理该事件,并且它将尝试为您处理事件(可能通过导航到上一个应用程序)。
TL;DR:如果您要在 BackRequested
事件中执行异步操作,请确保在您的第一个异步操作之前设置 Handled = true
。
我有一个 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] =] 事件,所以它调用下一个处理程序。
所以您看到的是两个问题的组合。
- 您在设置
Handled = true
之前执行了await
。 - 您有多个处理程序。
你还有一个问题:由于你的处理程序在执行它的 await
之前没有设置 Handled = true
,BackRequested
事件断定你没有处理该事件,并且它将尝试为您处理事件(可能通过导航到上一个应用程序)。
TL;DR:如果您要在 BackRequested
事件中执行异步操作,请确保在您的第一个异步操作之前设置 Handled = true
。