2013-07-20 2 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()에서 RequestServerAsync()의 내부에있는 현재 HttpWebResponse를 중단하려고 시도했지만, 같은 페이지로 다시 돌아올 때 충돌했습니다.

그래서, 짧은에, 문제가 :

  1. 페이지 시작으로 탐색은, 명령
  2. 새로운 요청을 만들어야합니다 현재 요청을
  3. 방문 페이지를 취소해야 (돌아 가기를 눌러) 페이지를 떠나을 기다리고 있습니다 기다리는 중입니다. (충분히 빨리 돌아 오는 경우)

이 문제를 해결하는 더 좋은 방법이 있습니까? 어쩌면 내가 때마다 viewmodels의 새로운 인스턴스를 생성해야합니까?

+1

귀하의 제품 카테고리 데이터 서비스 메소드가 취소 토큰을 허용합니까? –

+0

그리고 ThreadPool에 비동기 호출을 제출하는 이유는 무엇입니까? RequestServerAsync가 진정으로 비동기이면, 호출은 ThreadPool에서 끝날 것입니다. –

+0

@PanagiotisKanavos 그냥 괴롭히는 콜백을 다루기 위해서. –

답변

1

TPL 및 비동기 대기 코드의 취소는 CancellationTokenSourceCancellationToken을 사용하여 수행됩니다. 많은 비동기 메서드에는 CancellationToken을 매개 변수로 허용하는 오버로드가 있으며이 메서드는 메서드에서 취소를 관찰하는 데 사용됩니다.

Here은 비동기 작업 취소를 시작하고 처리하는 방법에 대한 MSDN 게시물입니다.

취소 토큰을 사용하는 경우 ThreadPool.QueueUserWorkItem 대신 CancellationToken 매개 변수를 사용하는 this overload of Task.Run을 사용하는 것이 좋습니다. 토큰 매개 변수는 취소시 취소 된 작업을 반환하기 위해 Task에 의해 내부적으로 사용되며이 오버로드를 사용하지 않으면 Task.Run에서 OperationCanceledException이 throw 될 수 있습니다.

관련 문제