Windows Phone 8地理位置不返回任何内容

时间:2013-03-20 11:31:57

标签: c# geolocation windows-phone-8 async-await

我正在创建一个具有“我附近的”类型功能的应用程序,并且我有一些代码可以找到用户的位置。

我发现虽然调用已经完成,但异步似乎永远不会返回。

我正在使用的代码是:

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,这是在ViewModel中,它被称为OnActivate。
  • 我已经在模拟器和我的Lumia 920上尝试了它,它发生在两者上。
  • 我尝试关闭定位服务,但没有任何变化。

2 个答案:

答案 0 :(得分:2)

除非您正在编写异步事件处理程序,否则不应使用具有async void签名的方法。无法等待这些方法,并且不会将任何抛出的异常返回给调用者。异常处理程序不会捕获此类异常。它们被传播到运行它们的线程的未处理异常处理程序。

事实上,最新一期MSDN杂志中的“Async Best Practices”文章正好提到了这个案例:

  

...异步Task方法抛出的任何异常都将直接在异步void方法启动时处于活动状态的SynchronizationContext上引发。图2说明了异步void方法抛出的异常无法自然捕获......

而不是async void,您应该返回async Task

答案 1 :(得分:0)

改为使用GeoCoordinateWatcher,

GeoCoordinate coord;    
GeoCoordinateWatcher watcher = new GeoCoordinateWatcher(GeoPositionAccuracy.High);
    watcher.PositionChanged += (s,ea) =>
    {
    coord = new Geocoordinate(ea.Position.Location.Latitude, ea.Position.Location.Longitude);

    }