2016-05-12 10 views
0

Hallo, ich kann nicht herausfinden, warum dieser async Betrieb nichtC# Asynchron-Betrieb wartet nicht wp8.1

private async void scroller_ViewChanged(object sender, ScrollViewerViewChangedEventArgs e) 
    { 
     if (isLoadingMore) 
      return; 
     if (scroller.VerticalOffset > scrollContent.ActualHeight - (Frame.ActualHeight + 300)) 
      await LoadMoreItems(); 
    } 
    bool isLoadingMore = false; 
    private async Task LoadMoreItems() 
    { 
     isLoadingMore = true; 
     try 
     { 
      List<Items> itemsList = await App.ServiceClient.GetItems("bananas");//<-------Doesn't wait 
      foreach (Items in itemsList) 
       listView.Items.Add(c); 
     } 
     catch { } 
     isLoadingMore = false; 
    } 

nicht warten Und dies ist der Back-End-Anruf mit einer anderen async Aufgabe

public async Task<List<Items>> GetItems(string selector) 
    { 
     HttpClient client = new HttpClient(); 
     var request = new HttpRequestMessage() 
     { 
      RequestUri = new Uri(myUrl), 
      Method = HttpMethod.Get, 
     }; 
     request.Headers.Add("Accept", "application/json"); 
     List<Items> items = null; 
     var task = await client.SendAsync(request).ContinueWith(
      async (s) => 
      { 
       try 
       { 
        string Result = await s.Result.Content.ReadAsStringAsync(); 
        if (s.Result.IsSuccessStatusCode) 
         items= JsonConvert.DeserializeObject<List<Items>>(Result); 
       } 
       catch 
       { } 
      }); 
     return items; 
    } 

Das Problem ist das verschachtelte erwartet oder in der Scoll-Ansicht. Ich fand this, aber ich denke nicht, dass dies der Fall ist.

+0

Bitte geben Sie [MCVE] (speziell "Minimal" Teil). Bis jetzt sieht 'async void' verdächtig aus - wahrscheinlich sind Ihre Erwartungen an das erwartete Verhalten anders als bei Feuer und Vergessen. –

Antwort

1

Der Event-Handler ist async void, so wird dies nie von der UI abgewartet werden, wenn Sie nicht mehr ViewChanged Ereignisse behandeln können Sie zwei Möglichkeiten:

1-Deaktivieren Sie die scroller während es ein asynchroner Aufruf ist die Ausführung :

private async void scroller_ViewChanged(object sender, ScrollViewerViewChangedEventArgs e) 
{ 
    scroller.Enabled = false; 
    try 
    { 
     if (isLoadingMore) 
      return; 
     if (scroller.VerticalOffset > scrollContent.ActualHeight - (Frame.ActualHeight + 300)) 
      await LoadMoreItems(); 
    } 
    finally{ scroller.Enabled = true; } 
} 

2-DO NOT den Code auszuführen, wenn es eine andere Lauf Event-Handler ist:

bool runnning = false 

private async void scroller_ViewChanged(object sender, ScrollViewerViewChangedEventArgs e) 
{ 
    if(running) 
     return; 

    runnning = true; 
    try 
    { 
     if (isLoadingMore) 
      return; 
     if (scroller.VerticalOffset > scrollContent.ActualHeight - (Frame.ActualHeight + 300)) 
      await LoadMoreItems(); 
    } 
    finally{ running = false; } 
} 
+0

Das Problem ist in der Liste itemsList, es wartet nicht auf den Back-End-Aufruf abzuschließen und auf die Foreach, wo es NULL Referenz excetion erhalten – Quakenxt

+0

Hmmm, fast 100% sicher, wenn das das Problem ist, weil das asynchrone Lambda ist, ist es Genau wie TaskFactory.StartNew und Task.Run, wird StartNew nicht warten, wenn das Lambda Async ist und der Run wird, der Unterschied ist, dass Run die Aufgabe für Sie auflöst. Wenn Sie dies tun, wartet es vielleicht: 'var task = await client.SendAsync (Anfrage) .ContinueWith (theLambda) .Unwrap() '. Hier finden Sie weitere Informationen: https://msdn.microsoft.com/en-us/library/dd780917%28v=vs.110%29.aspx – Gusman