停止并恢复异步调用

时间:2013-07-20 10:01:12

标签: c# windows-phone-7 mvvm asynchronous async-await

导航到页面时,我正在调用viewmodel

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. 访问页面应创建新请求,但等待仍在等待(如果返回足够快)
  4. 有没有更好的方法来解决这个问题?也许我每次都应该创建视图模型的新实例?

1 个答案:

答案 0 :(得分:1)

通过使用CancellationTokenSourceCancellationToken执行TPL和异步等待代码中的取消。许多异步方法都有一个重载,它接受一个CancellationToken作为参数,然后该方法使用它来观察取消。

Here是MSDN上有关如何启动和处理异步任务取消的帖子。

使用取消令牌时,我建议使用this overload of Task.Run,其中CancellationToken参数代替ThreadPool.QueueUserWorkItem。令牌参数在Task内部用于在取消时返回已取消的任务,未能使用此重载可能会导致OperationCanceledExceptionTask.Run抛出。