2017-03-02 46 views
0

現在我知道我可能做錯了什麼,因爲我對異步/等待非常陌生,..但我有一個隨機問題,我不能過去。C#VS2015只是在調試http異步響應時隨機停止項目

我打電話給Google Places API(成功)並獲得結果。

Response results = await Api.SearchPlaces(lat, lon, ""); 

結果填充了20個位置的響應,這很好。 然後,我嘗試循環遍歷它們並將它們添加到地點列表中。

var places = new List<Place>(); 

    foreach (var place in results.Places) 
    { 
     places.Add(place); 
    } 

並在調試器中,因爲我打結果。 - 視覺工作室只是停止調試。沒有錯誤,它只是停止。

如果我對結果進行調試並快速到達foreach循環,我可能會通過將地點添加到我的地點列表來獲得2-3次迭代,然後停止,如果我等待10秒鐘,它會停止第二次擊中了第一個迭代。

VS剛剛停止的一點似乎是關於Google查找完成的時間..但我只是不明白爲什麼我不能將結果添加到列表以及爲什麼VS沒有理由停下來。

我使用調用API是異步和返回任務

public static async System.Threading.Tasks.Task CreateAccountsFromGPSPositions() 
{ 

} 

我知道這可能是一個簡單的異步/等待的事情,但我只是不明白爲什麼VS只是停止時,整個方法仍然有代碼需要運行..

我沒有正確處理結果?我不能只是通過的foreach就像我通常會用結果做的東西..

被稱爲搜索的方法是這樣的:

async public static Task<Response> SearchPlaces(double latitude, double longitude, string query) 
    { 
     try 
     { 
      HttpResponseMessage resp; 
      resp = await Client.GetAsync(String.Format("nearbysearch/json?key={0}&location={1},{2}&sensor=true&rankby=distance&keyword={3}", AppSecret, latitude, longitude, query)); 

      if (resp.IsSuccessStatusCode) 
      { 
       return JsonConvert.DeserializeObject(await resp.Content.ReadAsStringAsync(), typeof(Response)) as Response; 
      } 
      else 
      { 
       return null; 
      } 
     } 
     catch 
     { 
      return null; 
     } 
    } 
+0

你將要閱讀這篇文章:https://msdn.microsoft.com/en-us/magazine/jj991977.aspx 。它將通過異步編程和錯誤處理來改變你的生活。 – Steve

回答

0

感謝史蒂夫, 我跟我的朋友誰讓我正確的這一點。很顯然,控制檯應用程序中的異步/等待行爲與Windows窗體應用程序或Web應用程序的行爲不同。我得到了一個僵局..如果VS告訴你,而不是隻停止沒有錯誤,將會得心應手...

解決方案是將我的等待呼叫包裹在Task.Run中並調用.Wait()以及。

完成代碼:

var task = System.Threading.Tasks.Task.Run(async() => await Api.SearchPlaces(lat, lon, "")); 
task.Wait(); 

然後

foreach (var place in task.Result.Places) 
{ 
    places.Add(place); 
} 
+0

在Windows窗體中有一個不同的SynchronizationContext。您可能會發現這篇文章有用:https://msdn.microsoft.com/en-us/magazine/gg598924.aspx?f=255&MSPPError=-2147217396 – vtortola