2016-04-28 59 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

相關問題