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 应用程序中的地理位置不起作用

c# Windows Phone 8.1 如何获取地理坐标对象

Windows phone 8.1 获取地图角落地理点