我正在使用ReverseGeocodeQuery
来检索许多位置的地址。问题是我得到了一个例外,结果如下:
HRESULT的异常:0x80041B57
看一下MSDN中的ReverseGeocodeQuery Class引用,我可以看到它列在可能的错误结果中,符号代码为EErrorIndexFailure
。但是,它没有给我更多关于错误的信息,StackTrace也是null。
我的代码如下:
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();
}
为什么我会收到此错误,我该怎么做?
答案 0 :(得分:5)
显然,api有点受限,无法同时进行多次ReverseGeocodeQuery
来电。
为了在 async / await 模式之后逐个创建它们,我实现了一个扩展方法:
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;
}
这样,在前一个完成之前不会进行呼叫。这种方法的缺点是如果我们有很多地方可能需要很长时间。