2015-12-20 62 views
0

我在Windows Phone 8.1應用程序的頁面中的事件調用方法時遇到問題。我對加載在我的第四頁PivotItems其中每觸發一個方法(PivotX.Loaded += LEvents;)是這樣的:中斷頁面中的所有事件

private async void LEvents(object SENDER, RoutedEventArgs e) 
{ 
    // Download Data 
    // Extract Data 
    // Put Data in The GridViews (LOOP) 
} 

但是,當我離開這個頁面,並清除緩存(所以頁面設置),該方法仍運行,造成衝突和例外。顯然,將數據放入GV中與下載和提取操作相比並不花費大量時間,所以我需要以強有力的方式停止整個功能。

有沒有辦法在處理之前停止頁面上所有正在運行的線程,方法或事件?

如果不是,一個一個停止它們的事件是一個想法,但只是停止他們。

+0

你是什麼意思方法仍在運行?他們是否有某種循環或者他們在做什麼? – Mino

+0

@Mino:他們只是異步的,他們每個人都有一個foreach,是的,但不是無限循環。 –

+0

您需要在循環中檢查某種中止標誌(或取消標誌),並在標誌置位時退出。 – Enigmativity

回答

1

如果要連接到這樣的事件:

Loaded += Page_Loaded; 

,那麼你可能要分離的處理器在OnNavigatedFrom()方法:

Loaded -= Page_Loaded; 

至於中斷該啓動所有正在運行的線程對於此頁面。 我不知道在創建的線程和頁面之間建立了任何連接。所以你將不得不手動管理它 - 而不是調用「await SomeAsyncMethod()」,你必須得到任務,將它存儲在一個集合中,當頁面關閉時,迭代集合並取消任何不是完了。這樣的事情:

Task task = SomeAsyncMethod(); 
task.Start(); 
tasks.Add(task); 
... 

OnNavigatedFrom() 
{ 
    foreach (var task in tasks) 
    { 
     if (!task.IsCancelled && !task.IsCompleted) 
      task.AsAsyncAction().Cancel(); 
    } 
} 

But I have not tested it and I do not guarantee this will work 
+0

它是否終止下標方法?這就是我要找的。 –

+0

這*似乎*已經解決了這個問題,非常感謝! –

+0

這不是一個解決方案,異步方法似乎不會停止這種方式。 –

相關問題