2016-04-28 34 views
0

我有一个UWP应用程序,我在几个地方添加了0​​。但是我发现了一个有趣的问题。那是当我将async添加到OnBackRequested事件的某些事件中时,我实际上会得到后退记住它被点击了多少次。也就是说,第一次点击它时,async OnBackRequested会触发一次,第二次点击它,async OnBackRequested会触发两次,等等。我想知道如果这是一个操作系统错误或其他任何东西。我该如何解决这个问题。谢谢!为什么在UWP中添加异步后会多次触发BackRequested事件?

+0

看起来你不止一次地将你的事件附加到BackRequested ... – Gusman

+0

因此,在添加'async'之前,它只能触发一次? – Stamos

+0

@Stamos我有几个地方有后备,任何没有异步的地方都会触发一次,但异步的地方会被触发多次。它实际上是由于未注销造成的。我认为unasync的作品,因为GC – litaoshen

回答

0

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

当导航到新的页面,我认为你做:

OnBackRequested += ..... 

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

+0

它的作品,谢谢!我认为GC为我做了那些不是异步的工作,你觉得呢? – litaoshen

1

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

BackRequested事件处理程序不知道您排队的任务。它看到处理程序返回了,它会检查您是否设置了Handled,并且由于您尚未设置Handled = true,它断定处理程序不想处理BackRequested事件,因此它会调用下一个处理程序。

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

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

你仍然有一个问题:由于处理程序不执行其await之前设置Handled = true,在BackRequested事件的结论是,你不处理该事件,并且它会尝试处理该事件对您(可能通过导航到以前的应用程序)。

TL; DR:如果您要在BackRequested事件中执行异步内容,请务必在第一次异步操作之前设置Handled = true

相关问题