2013-07-22 19 views
0

我使用ReverseGeocodeQuery來檢索許多位置的地址。問題是,我發現了一個exceptiona作爲結果,與以下消息:Reverse GeocodeQuery中的例外

從HRESULT異常:0x80041B57

有一個看MSDN中ReverseGeocodeQuery Class參考,我可以看到它上市在符號代碼EErrorIndexFailure的可能錯誤結果中。但是,它並沒有提供關於錯誤的更多信息,並且StackTrace也爲null。

我的代碼folloing:

foreach (var ev in events) 
{ 
    ReverseGeocodeQuery query = new ReverseGeocodeQuery(); 
    query.GeoCoordinate = ev.Location; 
    query.QueryCompleted += (s, e)=> 
    { 
     if (e.Error != null) 
      return; 

     ev.city = e.Result[0].Information.Address.City; 
    }; 
    query.QueryAsync(); 
} 

爲什麼會出現這個錯誤,我怎麼能做出這樣的工作?

回答

5

顯然,api有一點限制,並且不可能同時進行多個ReverseGeocodeQuery調用。

爲了讓他們一個接一個接着一個異步/伺機模式,我已經實現了一個擴展方法:

public static Task<T> ExecuteAsync<T>(this Query<T> query) 
{ 
    var taskSource = new TaskCompletionSource<T>(); 

    EventHandler<QueryCompletedEventArgs<T>> handler = null; 

    handler = (s, e) => 
    { 
     query.QueryCompleted -= handler; 

     if (e.Cancelled) 
      taskSource.SetCanceled(); 
     else if (e.Error != null) 
      taskSource.SetException(e.Error); 
     else 
      taskSource.SetResult(e.Result); 
    }; 

    query.QueryCompleted += handler; 

    query.QueryAsync(); 

    return taskSource.Task; 
} 

而且,當時我修改了代碼執行查詢以下方式:

foreach (var ev in events) 
{ 
    ReverseGeocodeQuery query = new ReverseGeocodeQuery(); 
    query.GeoCoordinate = ev.Location; 
    var result = await query.ExecuteAsync(); 
    ev.city = result[0].Information.Address.City; 
} 

這樣,直到前一個完成後才能進行呼叫。這種方法的缺點是,如果我們有很多地方,它可能需要很長時間。

+0

謝謝!這是有史以來最令人驚歎的答案之一! – libik