2016-11-30 4 views
0

Ich habe eine Funktion (unten), die ich Daten von einer API abrufen. Wenn ich einen Haltepunkt an der Zeile festlege, die ihn deserialisiert, kann ich sehen, dass er mit Daten gefüllt ist, die groß sind.ContinueWith nicht warten auf Aufgabe zu vervollständigen

Wenn ich weiter mache, geht es in die zweite Funktion (unten) und es wird ein Fehler ausgegeben. Der Fehler sagt daneben Not yet computed und wirft daher eine Ausnahme auf.

Wenn ich es mit einer kleinen Liste mache, funktioniert es gut (ich nehme an, es ist eine kleine Menge von Daten).

Wie ist das möglich, wenn ich ContinueWith (Warten auf die Aufgabe) verwenden?

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

Was passiert wird, wenn Sie vermeiden 'ContinueWith' warten nur' GetAllCardsInSet' Methode? – kat1330

+0

Gibt mir eine null-Referenz Ausnahme –

+0

Können Sie bitte untersuchen, was passieren wird, wenn Sie 'awarte Task.FromResult (cardData.Data)' statt 'cardData.Data' zurückgeben. – kat1330

Antwort

2

Ihre GetAllCardsInSet Methode keine Notwendigkeit zu ändern: Es sollte wie getan hat.
Aber die Verwendung dieser Methode kann refaktoriert werden.
Methode GetAllCardsInSet zurück Task und Sie haben nicht die Fertigstellung der dieser Task beobachtet.
Sie müssen überprüfen, ist Task erfolgreich abgeschlossen, einfachste Methode, await Schlüsselwort zu verwenden. Das Warten auf die Aufgabe wird den Rückgabewert zurückgeben oder die Ausnahme auslösen, wenn die Aufgabe mit Ausnahme abgeschlossen wurde.

Für die Verwendung von async/await im GetYugiohCardsAndNavigate Änderungsverfahren Signatur aynchronous und Rückkehr 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

Sie ein asynchrones Verfahren in einem Synchronisationsverfahren ohne Wait genannt.

  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(); 
Verwandte Themen