0

ReverseGeocodeQuery用来检索许多位置的地址。问题是我得到了一个异常结果,并带有以下消息:

HRESULT 异常:0x80041B57

查看 MSDN 中的ReverseGeocodeQuery 类参考,我可以看到它在可能的错误结果中列出,符号代码为EErrorIndexFailure. 但是,它没有给我更多关于错误的信息,而且 StackTrace 也是空的。

我的代码如下:

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

为什么我会收到这个错误,我怎样才能做到这一点?

4

1 回答 1

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

这样,在前一个完成之前不会进行呼叫。这种方法的缺点是,如果我们有很多地方,它可能需要很长时间。

于 2013-07-23T09:17:09.183 回答