2016-11-30 2 views
0

У меня есть функция (ниже), в которой я извлекаю данные из API. Если я установил точку останова в строке, которая десериализует ее, то я вижу, что она заполнена данными, которые являются большими.Продолжить Не дожидаясь завершения задачи

Когда я продолжаю, он переходит во вторую функцию (ниже) и выдает ошибку. Ошибка говорит рядом с ней Not yet computed и, следовательно, выбрасывает исключение.

Когда я делаю это с небольшим списком, он работает просто отлично (я полагаю, это потому, что это небольшой набор данных).

Как это возможно, когда я использую ContinueWith (ожидающий завершения задачи)?

public static async Task<Data> GetAllCardsInSet(string setName) 
    { 
       setName = WebUtility.UrlEncode(setName); 
       var correctUri = Path.Combine(ApiConstants.YugiohGetAllCardsInSet, setName); 
       Console.WriteLine(); 
       using (var httpClient = new HttpClient()) 
       { 
        var response = 
         await httpClient.GetAsync(correctUri); 
        var result = await response.Content.ReadAsStringAsync(); 
        var cardData = JsonConvert.DeserializeObject<CardSetCards>(result); 
        for (int i = 0; i < cardData.Data.Cards.Count; i++) 
        { 
         cardData.Data.Cards[i] = FormatWords(cardData.Data.Cards[i]); 
        } 
        return cardData.Data; 
       } 
    } 


    private void GetYugiohCardsAndNavigate(string name) 
    { 
    var cardSetData = YugiohRequester.GetAllCardsInSet(_selectedCardSet.Name).ContinueWith((result) => 
       { 
        //var cards = await YugiohRequester.GetAllCardsInSet(_selectedCardSet.Name); 
        try 
        { 
         this.mainPage.NavigateToYugiohCardListPage(result.Result); 
        } 
        catch (Exception e) 
        { 
         HelperFunctions.ShowToastNotification("Trading Card App", "Sorry, we could not fetch this set"); 
        } 

       }); 
} 
+0

Что будет произойти, если вы избегаете 'ContinueWith' просто ждать' метод GetAllCardsInSet'? – kat1330

+0

Дает мне нулевое исключение ссылки –

+0

Не могли бы вы исследовать, что произойдет, если вы вернетесь в 'Task_FromResult (cardData.Data)' вместо 'cardData.Data'. – kat1330

ответ

2

Ваш GetAllCardsInSet метода нет необходимости менять.
Но использование этого метода может быть реорганизовано.
Способ GetAllCardsInSet возвращение Task, и вы не заметили завершения этого Task.
Необходимо проверить, Task завершает успешный, простой подход к использованию await ключевое слово. Ожидающая задача будет отменять возвращенное значение или исключить исключение, если задача завершится с исключением.

Для использования async/await в методе GetYugiohCardsAndNavigate изменения подписи aynchronous и возвращение Task

private async Task GetYugiohCardsAndNavigate(string name) 
{ 
    try 
    { 
     var cardSetData = await YugiohRequester.GetAllCardsInSet(_selectedCardSet.Name); 
     this.mainPage.NavigateToYugiohCardListPage(cardSetData); 
    } 
    catch (Exception e) 
    { 
     HelperFunctions.ShowToastNotification("Trading Card App", 
               "Sorry, we could not fetch this set"); 
    } 
} 
0

вы назвали метод асинхронной в синхронизации метод без Wait. Это должно было быть сделано, как:

  YugiohRequester.GetAllCardsInSet(_selectedCardSet.Name).ContinueWith((result) => 
      { 
       //var cards = await YugiohRequester.GetAllCardsInSet(_selectedCardSet.Name); 
       try 
       { 
        this.mainPage.NavigateToYugiohCardListPage(result.Result); 
       } 
       catch (Exception e) 
       { 
        HelperFunctions.ShowToastNotification("Trading Card App", "Sorry, we could not fetch this set"); 
       } 

      }).Wait(); 
Смежные вопросы