Windows Phone 8 地理定位不返回任何内容
Posted
技术标签:
【中文标题】Windows Phone 8 地理定位不返回任何内容【英文标题】:Windows Phone 8 geolocation returns nothing 【发布时间】:2013-03-20 11:31:56 【问题描述】:我正在创建一个具有“我附近有什么”类型功能的应用,并且我有一些代码可以找到用户的位置。
我发现虽然调用已完成,但异步似乎永远不会返回。
我使用的代码是:
GeoCoordinate coord;
private async void GetNearMe()
try
Geolocator geolocator = new Geolocator();
Geoposition geoposition = await geolocator.GetGeopositionAsync();
coord = geoposition.Coordinate.ToGeoCoordinate();
catch (Exception ex)
<snip>
但代码有时只到达“coord =”行(并返回正确的数据)。如果是这样,由于某种原因,它可能不会再次出现。 如果它不起作用,它也永远不会到达 catch 块。它似乎挂了。
有没有人知道我可能做错了什么/更好的方法?
我使用的是 Caliburn Micro,它位于称为 OnActivate 的 ViewModel 中。 我已经在模拟器和我的 Lumia 920 上进行了尝试,两者都发生了。 我已尝试关闭并再次打开定位服务,但没有任何变化。【问题讨论】:
我注意到,这个特定的await
调用(在Geolocator
上)可能需要很长 时间才能返回,不知道为什么。你可能想订阅PositionChanged
event 看看它是如何工作的......
我唯一的区别是GetGeopositionAsync()
和AsTask(CancellationToken)
后缀,恐怕不能提供太多其他功能。
【参考方案1】:
除非您正在编写异步事件处理程序,否则您不应该使用带有async void
签名的方法。不能等待此类方法,并且在它们内部抛出的任何异常都不会返回给它们的调用者。此类异常不会被异常处理程序捕获。它们被传播到运行它们的线程的未处理异常处理程序。
事实上,最新一期 MSDN 杂志封面中的“Async Best Practices”文章正是提到了这种情况:
... 从异步 Task 方法抛出的任何异常都将直接在异步 void 方法启动时处于活动状态的 SynchronizationContext 上引发。图 2 说明了从 async void 方法抛出的异常无法自然捕获...
您应该返回async Task
,而不是async void
。
【讨论】:
【参考方案2】:改用 GeoCoordinateWatcher,
GeoCoordinate coord;
GeoCoordinateWatcher watcher = new GeoCoordinateWatcher(GeoPositionAccuracy.High);
watcher.PositionChanged += (s,ea) =>
coord = new Geocoordinate(ea.Position.Location.Latitude, ea.Position.Location.Longitude);
【讨论】:
以上是关于Windows Phone 8 地理定位不返回任何内容的主要内容,如果未能解决你的问题,请参考以下文章
在 Windows Phone 8.1 上获取给定 CivicAddress 的坐标/地理点
Windows Phone 7 中具有地理定位服务的邮政编码
Windows Phone:PositionChanged 未触发 Windows 8
Windows Phone HTML 应用程序中的地理位置不起作用