C# Windows Phone 8地理位置不返回任何内容
我正在创建一个具有“what's near me”类型功能的应用程序,并且我有一些代码来查找用户的位置 我发现虽然调用已完成,但异步似乎从未返回 我使用的代码是: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
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)
作为后缀,恐怕无法提供更多其他功能。