2013-07-20 125 views
0

當瀏覽網頁,我打電話視圖模型停止和恢復異步調用

public void OnNavigatedTo() 
    { 
    ThreadPool.QueueUserWorkItem(async o => 
     { 
      collectionsAnswer = await productCategoriesDataService.RequestServerAsync(); 
      *** 
      if (collectionsAnswer.status == Ok) 
      { 
       var parsedList = await productCategoriesDataService.Parse(collectionsAnswer.json); 
       _itemsList = new List<ProductItem>(parsedList); 
       DispatcherHelper.CheckBeginInvokeOnUI(() => 
        RaisePropertyChanged("ItemsList", _itemsList, _itemsList, true)); 
      } 
     } 

如何停止/正常恢復呢?我嘗試從OnNavigatedFrom()中取消當前的HttpWebResponse(它位於RequestServerAsync()的內部),但是當我再次返回同一頁時,它崩潰了。

因此,簡而言之,問題是:

  1. 導航頁開始等待命令
  2. 離開該頁面(按後)應取消當前請求
  3. 訪問頁面應該創建新的請求,但等待仍在等待(如果返回足夠快)

有沒有更好的方法來解決這個問題?也許我應該每次創建viewmodels的新實例?

+1

您的產品類別數據服務方法是否接受取消令牌? –

+0

你爲什麼要提交一個異步調用ThreadPool?如果RequestServerAsync真的是異步的,那麼你的調用最終會在ThreadPool中結束。 –

+0

@PanagiotisKanavos只是爲了應對瘋狂的回調。 –

回答

1

TPL和異步等待代碼中的取消通過使用CancellationTokenSourceCancellationToken執行。許多異步方法都有一個過載,它接受一個CancellationToken作爲參數,然後由方法使用它來觀察取消。

Here是MSDN上關於如何啓動和處理異步任務取消的文章。

當使用取消標記時,我會建議使用this overload of Task.Run,這需要CancellationToken參數而不是ThreadPool.QueueUserWorkItem。令牌參數由Task在內部使用以在取消時返回取消的任務,未能使用此超載可能會導致從Task.Run丟棄OperationCanceledException