2013-07-20 97 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