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. 访问页面应创建新请求,但等待仍在等待(如果返回速度足够快)

有没有更好的方法来解决这个问题?也许我应该每次都创建新的视图模型实例?

4

1 回答 1

1

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

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

使用取消令牌时,我建议使用Task.Run 的这种重载,它采用CancellationToken参数而不是ThreadPool.QueueUserWorkItem. token 参数由 内部使用,Task以在取消时返回已取消的任务,未能使用此重载可能会导致OperationCanceledExceptionTask.Run.

于 2013-12-19T19:20:02.763 回答