2016-11-28 7 views
0

я создал для Windows Phone 8.0 Silverlight App метод асинхронной GetStreetNameWindows Phone 8 - Получение Multiple названия улиц

string streetname; 

private async Task<string> GetStreetName(int i) 
{ 
    MapAddress address; 
    ReverseGeocodeQuery query = new ReverseGeocodeQuery(); 
    query.GeoCoordinate = Route[i].Item1; 
    query.QueryCompleted += (s, e) => 
    { 
     if (e.Error != null) 
      return; 

     address = e.Result[0].Information.Address; 
     streetname = address.Street; 
}; 
query.QueryAsync(); 
return streetname; 
} 

и я называю это с помощью оператора AWAIT внутри для цикла:

for (int i = 0; i < Route.Count; i++) 
{ 
     ListBox.Items.Add(await GetStreetName(i)); 
} 

, но я всегда получаю только название улицы первого загруженного геопозиции, и я понятия не имею, почему (я думал, что ожидающий оператор ждет, пока не будет закончен асинхронный метод).

Дополнительная информация: Я только что увидел, что на этом коротком фрагменте это не на 100%, название улицы и маршрут являются глобальными «переменными». Маршрут - это список кортежей, где первый элемент является геокоординатным.

Как исправить эту проблему?

ответ

2

Вы возвращаетесь с GetStreetName до того, как все будет готово. Becayse query.QueryAsync(); только начинает запрос и не ждет его завершения.

Кроме того, вы пишете все результаты с тем же глобальным streetname.

Вам необходимо использовать TaskCompletionSource.

попробовать что-то вроде этого:

private async Task<string> GetStreetNameAsync(int i) 
{ 
    var tcs = new TaskCompletionSource<IEnumerable<string>>(); 

    EventHandler<QueryCompletedEventArgs<IList<MapLocation>>> handler = (s, e) => 
     { 
      if (e.Error != null) 
      { 
       tcs.TrySetException(e.Error); 
       return; 
      } 

      if (e.Cancelled) 
      { 
       tcs.TrySetCanceled(); 
       return; 
      } 

      tcs.TrySetResult(e.Result[0].Information.Address.Street); 
     }; 

    var query = new ReverseGeocodeQuery(); 
    query.GeoCoordinate = Route[i].Item1; 

    try 
    { 
     query.QueryCompleted += handler; 

     query.QueryAsync(); 

     return await tcs.Task; 
    } 
    finally 
    { 
     query.QueryCompleted -= handler; 
    } 
}