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

C# Windows Phone 8地理位置不返回任何内容,c#,geolocation,windows-phone-8,async-await,C#,Geolocation,Windows Phone 8,Async Await,我正在创建一个具有“what's near me”类型功能的应用程序,并且我有一些代码来查找用户的位置 我发现虽然调用已完成,但异步似乎从未返回 我使用的代码是: GeoCoordinate coord; private async void GetNearMe() { try { Geolocator geolocator = new Geolocator(); Geoposition geoposition = await geolocator

我正在创建一个具有“what's near me”类型功能的应用程序,并且我有一些代码来查找用户的位置

我发现虽然调用已完成,但异步似乎从未返回

我使用的代码是:

GeoCoordinate coord;
private async void GetNearMe()
{
    try
    {
        Geolocator geolocator = new Geolocator();
        Geoposition geoposition = await geolocator.GetGeopositionAsync();

        coord = geoposition.Coordinate.ToGeoCoordinate();
    }
    catch (Exception ex)
    {
        <snip>
    }
}
地理坐标坐标坐标;
私有异步void GetNearMe()
{
尝试
{
Geolocator Geolocator=新的Geolocator();
Geoposition Geoposition=等待geolocator.GetGeoPositionSync();
坐标=地理位置.Coordinate.togeocordinate();
}
捕获(例外情况除外)
{
}
}
但代码有时只会到达“coord=”行(并返回正确的数据)。如果是这样的话,出于某种原因,它可能不会再出现了。 而且,如果它不工作,它永远不会到达捕捉块。它只是好像挂起来了

有没有人知道我可能做错了什么/有没有更好的方法

  • 我使用的是Caliburn Micro,它位于ViewModel中,名为OnActivate
  • 我在emulator和我的Lumia 920上都试过了,这两个版本都有
  • 我已经尝试过在没有改变的情况下关闭和打开定位服务

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

事实上,MSDN杂志最新版封面上的“”一文正好提到了这一情况:

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


您应该返回
async Task

而不是
async void
,使用GeoCoordinateWatcher

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

    }

我注意到,这个特殊的
等待
呼叫(在
地理定位仪上
)可能需要很长时间才能返回,不知道为什么。您可能想订阅,看看它是如何工作的……我唯一的区别是将
GetGeopositionAsync()
AsTask(CancellationToken)
作为后缀,恐怕无法提供更多其他功能。