2016-05-12 131 views
0

你好,我想不通为什么这个异步操作不会等待C#异步操作不等待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; 
    } 

这是后台调用另一个异步任务

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; 
    } 

问题是嵌套等待或在scoll视图中。我发现this但我不认为这是事实。

+0

请提供[MCVE](特别是 “最小” 的一部分)。到目前为止,'async void'看起来很可疑 - 很可能你对预期行为的期望与“忘却遗忘”不同。 –

回答

1

事件处理程序是async void,所以这绝不会由UI被期待已久的,如果你不能处理多个ViewChanged事件,你有两个选择:

1 - 禁用滚动,同时有一个异步调用执行:

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 - 别执行的代码是否有另一个事件处理程序运行:

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

问题是在列表 itemsList,它不会等待完成后端调用,并连续到foreach它的空引用exceular – Quakenxt

+0

嗯,几乎100%肯定,如果这是问题是因为异步lambda,它是和使用TaskFactory.StartNew和Task.Run一样,StartNew不会等待lambda是异步的,Run会不同,所不同的是Run为你打开任务,所以如果你这样做,它会等待:'var task = await client.SendAsync(request).ContinueWith(theLambda).Unwrap()'。以下是更多信息:https://msdn.microsoft.com/en-us/library/dd780917%28v=vs.110%29.aspx – Gusman