导航到页面时,我正在调用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()内部),但是当我再次返回同一页面时它崩溃了。
因此,简而言之,问题是:
有没有更好的方法来解决这个问题?也许我每次都应该创建视图模型的新实例?
答案 0 :(得分:1)
通过使用CancellationTokenSource
和CancellationToken
执行TPL和异步等待代码中的取消。许多异步方法都有一个重载,它接受一个CancellationToken
作为参数,然后该方法使用它来观察取消。
Here是MSDN上有关如何启动和处理异步任务取消的帖子。
使用取消令牌时,我建议使用this overload of Task.Run,其中CancellationToken
参数代替ThreadPool.QueueUserWorkItem
。令牌参数在Task
内部用于在取消时返回已取消的任务,未能使用此重载可能会导致OperationCanceledException
被Task.Run
抛出。