.NET6使用GoogleGeocoder反向地理编码遇WaitingForActivation问题
问题场景
- 运行环境:.NET 6
- 实现目标:对指定坐标执行反向地理编码操作,采用接入Google API的
GoogleGeocoder组件实现功能,API密钥出于安全考虑已隐藏 - 核心实现代码:
IGeocoder geocoder = new GoogleGeocoder() { ApiKey = "" }; static async Task<IEnumerable<Address>> getPlaceAsync(IGeocoder geocoder) { IEnumerable<Address> addresses = await geocoder.ReverseGeocodeAsync(51.683, -1.68847); return addresses; } var ff = getPlaceAsync(geocoder);
- 异常现象:在函数调用语句之后设置断点查看返回结果,得到的响应状态为
WaitingForActivation,结果截图如下:
问题原因
该问题由异步方法的错误调用方式导致:getPlaceAsync是返回Task<IEnumerable<Address>>的异步方法,直接调用方法但未使用await关键字时,变量存储的是代表异步操作的Task对象本身,而非方法最终返回的地址集合结果。WaitingForActivation是异步任务未完成时的标准状态,代表后台地理编码请求还在执行过程中,尚未产出最终结果。
解决方案
根据代码所在上下文选择对应修正方式即可:
- 若调用代码处于异步方法上下文中,直接对方法调用添加
await关键字,即可拿到实际返回的地址集合结果,这是异步编程的标准写法:
var ff = await getPlaceAsync(geocoder);
- 若调用代码处于同步上下文(例如非异步的控制台Main方法)中,可通过
.GetAwaiter().GetResult()等待任务完成后获取结果。注意该写法不推荐作为常规实现,同步上下文嵌套等待异步任务存在死锁风险,优先将调用方改造为异步方法:
var ff = getPlaceAsync(geocoder).GetAwaiter().GetResult();
额外提示:正式运行代码前需要为
ApiKey字段填入你申请的有效Google Geocoding API密钥,否则即使异步调用逻辑正确,也会因为鉴权失败抛出请求异常。
内容的提问来源于stack exchange,提问作者BUIBBE
相关产品推荐
相关产品推荐

